Docker網絡概念
網絡驅動
Docker 網絡子系統使用可插拔的驅動,默認情況下有多個驅動程序,並提供核心聯網功能。
- bridge:橋接網絡,這是默認的網絡驅動程序(不指定驅動程序創建的容器默認是bridge驅動)。
- host:主機網絡。消除容器和主機的網絡隔離,直接使用主機的網絡。
- overlay:覆蓋網絡。可以將多個Docker守護進程連接,實現跨主機容器通訊(swarm集群)。
- macvlan:將MAC地址分配給容器,使容器作為網絡上的物理設備。不通過Docker主機網絡棧進行路由,直接通過MAC地址路由到容器。
- none:表示關閉容器的所有網絡連接。常與自定義網絡驅動一起使用,不適用於swarm。
- 網絡插件:可以通過Docker安裝和使用第三方網絡插件。
Docker網絡驅動選用原則
- bridge橋接網絡:最適合用於同一個Docker主機上運行的多個容器之間需要通信的場景。(單主機)
- host主機網絡:最適用於當網絡棧不能與Docker主機隔離,而容器的其他方面需要被隔離的場景。(解除容器和主機隔離)
- overlay網絡:適用於不同Docker主機上運行的容器需要通信的場景,或者多個應用程序通過Swarm集群服務一起工作的場景。(多主機、集群)
- macvlan網絡:適用於從虛擬機遷移過來的場景,或者容器需要像網絡上的物理機一樣,擁有獨立MAC地址的場景。(容器需要mac)
- 第三方網絡插件適用於將Docker與專用網絡棧進行集成的場景。(訂制化)
容器的網絡模式
bridge模式
橋接網絡分為默認橋接網絡和用戶自定義橋接網絡兩種類型。
橋接網絡用於同(單)主機運行的容器間通信。
實現原理:橋接網絡使用軟件網橋,讓連接到同一橋接網絡的容器可以通信,沒連接該網橋的容器被隔離。
工作流程:Docker守護進程啟動,會在主機上創建一個名為 docker0
的虛擬網橋,啟動容器時如果沒有特別指定,自動連接到這個虛擬網橋。
[root@localhost ~]# ifconfig
docker0: flags=4099<UP,BROADCAST,MULTICAST> mtu 1500
inet 172.17.0.1 netmask 255.255.0.0 broadcast 172.17.255.255
ether 02:42:b2:81:22:9d txqueuelen 0 (Ethernet)
RX packets 0 bytes 0 (0.0 B)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 0 bytes 0 (0.0 B)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
Docker 守護進程為每個啟動的容器創建一個 VETH對設備(總是成對出現,組成數據通道)。
VETH對是直接連接的一對虛擬網絡接口,一個接口設置為新創建容器的接口(位於容器的網絡名稱空間中);另一個接口連接到虛擬網橋docker0(位於Docker的網絡名稱空間中)。
host模式
host模式的容器使用host驅動,直接連接Docker主機網絡棧。實質:關閉 Docker 網絡,讓容器直接使用主機操作系統的網絡。
host模式沒有為容器創建一個隔離的網絡環境,容器沒有隔離的網絡名稱空間,也不會獲得一個獨立的網絡名稱空間,而是和Docker主機共用一個網絡名稱空間。
容器和主機在同一個網絡中,使用主機的物理網絡接口,沒有獨立的IP地址,直接使用主機的IP地址和端口。
由於主機名、地址都一樣,因此同一主機上的容器要做好協調。各容器通過端口來進行區分。
container模式
Docker中一種較為特別的網絡模式,主要用於容器和容器直接頻繁交流的情況。
特點:
- 該模式指定新建的容器和現有的一個容器共享網絡名稱空間。
- 新創建的容器和一個現有的指定容器共享IP地址、端口范圍,不創建自己的網絡接口、IP地址。
- 兩個容器間網絡不隔離,進程可通過回環網絡進行通信。
- 這兩個容器和主機和其他容器存在網絡隔離。
none模式
none模式將容器放置在它自己的網絡棧中,但是並不進行任何配置,實際上關閉了容器的網絡功能。
特性:none模式,容器有自己的網絡名稱空間,但未進行任何網絡配置,未構建任何網絡環境,容器內部只能使用回環網絡接口(127.0.0.1)。
可用場景:
- 有些容器並不需要網絡,例如只需要寫入磁盤卷的批處理任務。
- 安全性要求高並且不需要聯網的應用可以使用none模式。
- 要創建自定義網絡。
自定義模式
管理員可以使用Docker網絡驅動(bridge、overlay、macvlan)或第三方網絡驅動插件創建一個自定義的網絡,然后將多個容器連接到同一個自定義網絡。
特點:
- 連接到用戶自定義網絡的容器,可以使用IP地址或名稱相互通信。
- 可以根據需要創建任意數量的自定義網絡。
- 可以在任何時間將容器連接到這些網絡。
- 對運行中的容器,可連接、斷開自定義網絡,無須重啟容器。
用戶自定義橋接網絡(自定義網絡使用bridge網絡驅動):單機環境常用。生產環境推薦使用。
生產環境不推薦使用默認橋接網絡,推薦使用用戶自定義橋接網絡,原因在以下區別:
- 用戶自定義橋接網絡能提供容器化應用程序之間更好的隔離和互操作性。如果在默認橋接網絡上運行應用棧,則Docker主機需要通過其他方式來限制對端口的訪問。
- 用戶自定義橋接網絡提供容器之間自動DNS解析功能,可以通過名稱或別名互相訪問。而默認橋接網絡上的容器只能通過IP地址互相訪問。
- 容器可以在運行時與用戶自定義網絡連接和斷開。要斷開與默認橋接網絡的連接,需要停止容器並使用不同的網絡選項重新創建該容器。
- 每個用戶可通過自定義網絡創建一個可配置的網橋。而默認橋接網絡會自動穿件一個名為docker0的虛擬網橋。
- 用戶自定義網絡中所連接容器不能共享環境變量,不過有更好的方式實現共享環境變量(docker卷掛載、compose文件定義、集群)。默認橋接網絡中所連接的容器共享環境變量。
傳統容器連接
創建容器時使用--link選項可以在容器之間建立連接,這是Docker傳統的容器互聯解決方案。
特性:
- 這種連接方式用來將多個容器連接在一起,並在容器之間發送連接信息。
- 當容器被連接時,在源容器和 接收容器 之間建立一個
安全通道
,關於源容器的信息能夠被發送到接收容器,讓接收容器可以訪問源容器所指定的數據。
為容器設置自定義名稱的好處:
- 表示特定用途的名稱更易記憶,如將一個Web應用的容器命名為web。
- 便於Docker通過該名稱引用其他容器,彌補默認橋接網絡不支持容器名稱解析的不足
# 語法
[root@localhost ~]# docker create --help
Usage: docker create [OPTIONS] IMAGE [COMMAND] [ARG...]
Create a new container
Options:
--link list Add link to another container # 添加連接到另一個容器
# 案例
# 創建容器時,添加到第一個容器的連接,並配置別名alp
docker run -dit --name alpine2 --link alpine1:alp alpine ash
容器訪問外部網絡
默認情況下,容器可以主動訪問到外部網絡的連接,但是外部網絡無法訪問到容器。
使用bridge模式(默認橋接網絡)的容器通過NAT方式實現外部訪問,具體通過iptables(Linux的包過濾防火牆)的源地址偽裝操作實現。
iptables源地址偽裝:容器所有到外部網絡的連接,源地址都會被 NAT 成本地系統的 IP 地址(即docker0地址)。
查看主機的 NAT 規則:
[root@localhost ~]# iptables -t nat -vnL
Chain PREROUTING (policy ACCEPT 142 packets, 31842 bytes)
pkts bytes target prot opt in out source destination
1 52 DOCKER all -- * * 0.0.0.0/0 0.0.0.0/0 ADDRTYPE match dst-type LOCAL
Chain INPUT (policy ACCEPT 140 packets, 31384 bytes)
pkts bytes target prot opt in out source destination
Chain OUTPUT (policy ACCEPT 4 packets, 288 bytes)
pkts bytes target prot opt in out source destination
0 0 DOCKER all -- * * 0.0.0.0/0 !127.0.0.0/8 ADDRTYPE match dst-type LOCAL
Chain POSTROUTING (policy ACCEPT 4 packets, 288 bytes)
pkts bytes target prot opt in out source destination
0 0 MASQUERADE all -- * !docker0 172.17.0.0/16 0.0.0.0/0 《————這一條規則將所有源地址在 172.17.0.0/16 網段,目標地址為其他網段(外部網絡)的流量動態偽裝為從系統網卡發出。
MASQUERADE 相比傳統 SNAT 的好處是它能動態從網卡獲取地址。
Chain DOCKER (2 references)
pkts bytes target prot opt in out source destination
0 0 RETURN all -- docker0 * 0.0.0.0/0 0.0.0.0/0
容器網絡配置
設置容器網絡連接
容器啟動時,可以使用 --network
選項設置容器要連接的網絡,即網絡模式。
none:容器為none模式,容器不使用任何網絡連接,能完全禁用網絡連接。
bridge:容器為bridge模式,連接到默認橋接網絡,也是默認設置。
host:容器為host模式,使用主機網絡棧。
container:容器為container模式,容器使用某一個容器(通過id或name來標識)的網絡棧。
網絡名or網絡id:容器連接自定義網絡,可使用自定義網絡的名稱或id。
# 語法
[root@localhost ~]# docker run --help
Usage: docker run [OPTIONS] IMAGE [COMMAND] [ARG...]
--network network Connect a container to a network # 連接容器到網絡中
# 案例
[root@localhost ~]# docker network ls
NETWORK ID NAME DRIVER SCOPE
9b3f5f5076b9 bridge bridge local
76d9e06a3606 host host local
9f44873071f4 none null local
[root@localhost ~]# docker run --network none -dit --name centos-test centos /bin/bash
24110a1ca4da0f6d7659d7d2e8a1f57a8d980031ab54ac4730a3b89e44679e46
[root@localhost ~]# docker inspect --format='{{json .HostConfig.NetworkMode}}' 24110a1ca4da
"none"
容器添加網絡作用域別名
容器在網絡作用域中允許有別名,別名在所在網絡中可以直接訪問。使用 --network-alias
選項指定容器在網絡中的別名。
注意:網絡作用域別名只支持用戶自定義的網絡。
# 語法
[root@localhost ~]# docker run --help
Usage: docker run [OPTIONS] IMAGE [COMMAND] [ARG...]
--network-alias list Add network-scoped alias for the container # 給容器添加網絡作用域別名
# 失敗案例
[root@localhost ~]# docker run -d -p 80:80 --name testweb --network host --network-alias websrv centos
docker: network-scoped aliases are only supported for user-defined networks. # 網絡作用域別名只支持用戶自定義的網絡
# 案例
[root@localhost ~]# docker network create --driver bridge mynet
a7b402ee062eaf27c50fb303ae6e764f384cd7b2ebd0acf61fdeeba68bddb5f6
[root@localhost ~]# docker network ls
NETWORK ID NAME DRIVER SCOPE
9b3f5f5076b9 bridge bridge local
76d9e06a3606 host host local
a7b402ee062e mynet bridge local
9f44873071f4 none null local
[root@localhost ~]# docker run -d -p 80:80 --name testweb --network mynet --network-alias websrv centos
0630c88e381c805fb9176bf682dfdca5f541d3104364a238a5b4045ca5a7a014
設置容器ip
使用--network
選項啟動容器連接自定義網絡時,可以使用 --ip
或 --ip6
選項明確指定分配給該網絡容器的ip地址。
使用前面創建的mynet,創建新容器指定ip時報錯:Error response from daemon: user specified IP address is supported only when connecting to networks with user configured subnets.
注意:僅當連接到具有用戶配置的子網的網絡時,才支持用戶指定的IP地址。
# 語法
[root@localhost ~]# docker run --help
Usage: docker run [OPTIONS] IMAGE [COMMAND] [ARG...]
--ip string IPv4 address (e.g., 172.30.100.104)
--ip6 string IPv6 address (e.g., 2001:db8::33)
# 案例
[root@localhost ~]# docker network create --driver bridge --subnet 172.19.1.0/24 --gateway 172.19.1.1 mynet02
97f9b61b3a30228b714781bfca5c0b6fe2bb140bdb6520eb87f706016707f2d9
[root@localhost ~]# docker network inspect mynet02
[
{
"Name": "mynet02",
"Id": "97f9b61b3a30228b714781bfca5c0b6fe2bb140bdb6520eb87f706016707f2d9",
"Created": "2022-04-13T17:15:12.435135856+08:00",
"Scope": "local",
"Driver": "bridge",
"EnableIPv6": false,
"IPAM": {
"Driver": "default",
"Options": {},
"Config": [
{
"Subnet": "172.19.1.0/24",
"Gateway": "172.19.1.1"
}
]
},
"Internal": false,
"Attachable": false,
"Ingress": false,
"ConfigFrom": {
"Network": ""
},
"ConfigOnly": false,
"Containers": {},
"Options": {},
"Labels": {}
}
]
[root@localhost ~]# docker run -d -p 8000:80 --name testweb02 --network mynet02 --network-alias web02 --ip 172.19.1.101 centos
dd8d96ea1e680e010c7a1041dc311fd6eee7194fa8b26a134ccb3053aafee17d
設置容器網絡接口MAC地址
默認情況下,容器mac地址是基於其IP地址生成。
可以通過 --mac-address
選項為容器指定一個MAC地址。
注意:手動指定mac地址,docker不會檢查地址的唯一性。
# 語法
[root@localhost ~]# docker run --help
Usage: docker run [OPTIONS] IMAGE [COMMAND] [ARG...]
--mac-address string Container MAC address (e.g., 92:d0:c6:0a:29:33)
# 案例
[root@localhost ~]# docker run -d -p 8080:80 --name testweb03 --network mynet --network-alias web03 --mac-address 12:34:56:78:9a:bc centos
4bc34a65f48f46b95c021194dec216f640d8974f98c6c297dcc37c64f924436b
[root@localhost ~]# docker inspect --format='{{json .Config.MacAddress}}' 4bc34a65
"12:34:56:78:9a:bc"
設置容器的DNS配置和主機名
默認情況下,容器繼承Docker守護進程的DNS配置,包括 /etc/hosts
和 /etc/resolv.conf
配置文件。
可以使用以下選項配置DNS,覆蓋默認配置。
# 語法
[root@localhost ~]# docker run --help
Usage: docker run [OPTIONS] IMAGE [COMMAND] [ARG...]
--dns list Set custom DNS servers # 為容器設置DNS服務器的IP地址
可以使用多個--dns為容器指定多個DNS服務器。
容器連不上指定DNS服務器,會自動使用google的公共dns:8.8.8.8。
--dns-option list Set DNS options # 為容器設置表示DNS選項及值的鍵值對
--dns-search list Set custom DNS search domains # 為容器指定一個DNS搜索域
-h, --hostname string Container host name # 為容器指定自定義的主機名
# --dns案例
[root@localhost ~]# docker run -d -p 8081:80 --name testdns --network mynet --dns 202.103.24.68 centos
101cf268006a5780c9e69e147d302933aa91bace5922c5527d41f5dcec4a23f9
[root@localhost ~]# docker inspect --format='{{json .HostConfig.Dns}}' 101cf268
["202.103.24.68"]
docker網絡管理命令
docker network
是Docker 網絡本身的管理命令。
# 語法
[root@localhost ~]# docker network --help
Usage: docker network COMMAND
Manage networks 網絡管理
Commands:
connect Connect a container to a network # 將容器連接到網絡
create Create a network # 創建網絡
disconnect Disconnect a container from a network # 斷開容器和某網絡的連接
inspect Display detailed information on one or more networks # 顯示網絡的詳細信息
ls List networks # 顯示網絡列表
prune Remove all unused networks # 刪除未被使用網絡
rm Remove one or more networks # 刪除指定網絡
Run 'docker network COMMAND --help' for more information on a command.
查看網絡列表
執行 docker network ls
命令,可查看當前網絡列表。
網絡作用域為local,則僅在docker主機范圍內提供連接和網絡服務。
# 語法
[root@localhost ~]# docker network ls --help
Usage: docker network ls [OPTIONS]
List networks
Aliases:
ls, list
Options:
-f, --filter filter Provide filter values (e.g. 'driver=bridge')
--format string Pretty-print networks using a Go template
--no-trunc Do not truncate the output
-q, --quiet Only display network IDs
# 案例
[root@localhost ~]# docker network ls
網絡ID 網絡名稱 網絡驅動 作用域
NETWORK ID NAME DRIVER SCOPE
989e0968a6fe bridge bridge local
76d9e06a3606 host host local
9f44873071f4 none null local
[root@localhost ~]# docker network ls -q
989e0968a6fe
76d9e06a3606
9f44873071f4
[root@localhost ~]# docker network ls --filter driver=bridge
NETWORK ID NAME DRIVER SCOPE
989e0968a6fe bridge bridge local
[root@localhost ~]# docker network ls --format asdasd
asdasd
asdasd
asdasd
[root@localhost ~]# docker network ls --no-trunc
NETWORK ID NAME DRIVER SCOPE
989e0968a6fe9b95dd76238e4707f40bc0cf288fd6b764acbd537954fd0e6fcf bridge bridge local
76d9e06a360678e6c0b12b13d9cdde88cb63a77807012cb7e4e8b66bfd47e88b host host local
9f44873071f4baa0f97756fd0b904cde51a718455689ccc58252d374b4d47992 none null local
查看網絡詳細信息
執行 docker network inspect
命令查看指定網絡的詳細信息。
參數可以是網絡名稱或網絡ID。
# 語法
[root@localhost ~]# docker network inspect --help
Usage: docker network inspect [OPTIONS] NETWORK [NETWORK...]
Display detailed information on one or more networks
Options:
-f, --format string Format the output using the given Go template
-v, --verbose Verbose output for diagnostics # 診斷的詳細輸出
# 案例
[root@localhost ~]# docker network inspect bridge
[
{
"Name": "bridge",
"Id": "989e0968a6fe9b95dd76238e4707f40bc0cf288fd6b764acbd537954fd0e6fcf",
"Created": "2022-04-19T21:56:32.999550849+08:00",
"Scope": "local",
"Driver": "bridge",
"EnableIPv6": false,
"IPAM": {
"Driver": "default",
"Options": null,
"Config": [
{
"Subnet": "172.17.0.0/16",
"Gateway": "172.17.0.1"
}
]
},
"Internal": false,
"Attachable": false,
"Ingress": false,
"ConfigFrom": {
"Network": ""
},
"ConfigOnly": false,
"Containers": {
"15d605de252549571b613ec08b397af49060e1d6f1a45548f884a7d2de896c56": {
"Name": "test-dns02",
"EndpointID": "a474c3a28141e679b93f7c4d44616452114e310f5bf8f40560f3f73eb90a1f7f",
"MacAddress": "02:42:ac:11:00:03",
"IPv4Address": "172.17.0.3/16",
"IPv6Address": ""
},
"24574957d30aab88b2b4ebcb98c0878470a78a05df03dfb86ad4078fabed1fe5": {
"Name": "test-dns03",
"EndpointID": "745a7c6b314b5963c6d134c148205fc0a215f1f3afb7948246a423088863ab4e",
"MacAddress": "02:42:ac:11:00:04",
"IPv4Address": "172.17.0.4/16",
"IPv6Address": ""
},
"60e63a6f891f2b8a25847c410f35ca0c88f172c15edbb39fd3631a61b7fc5ad0": {
"Name": "test-dns",
"EndpointID": "08574b9714bb18374c24cddb340a932a332a9aeda71037548e5ea87966c904f8",
"MacAddress": "02:42:ac:11:00:02",
"IPv4Address": "172.17.0.2/16",
"IPv6Address": ""
}
},
"Options": {
"com.docker.network.bridge.default_bridge": "true",
"com.docker.network.bridge.enable_icc": "true",
"com.docker.network.bridge.enable_ip_masquerade": "true",
"com.docker.network.bridge.host_binding_ipv4": "0.0.0.0",
"com.docker.network.bridge.name": "docker0",
"com.docker.network.driver.mtu": "1500"
},
"Labels": {}
}
]
# --format篩選輸出
[root@localhost ~]# docker network inspect --format='{{json .Options}}' bridge
{"com.docker.network.bridge.default_bridge":"true","com.docker.network.bridge.enable_icc":"true","com.docker.network.bridge.enable_ip_masquerade":"true","com.docker.network.bridge.host_binding_ipv4":"0.0.0.0","com.docker.network.bridge.name":"docker0","com.docker.network.driver.mtu":"1500"}
[root@localhost ~]# docker network inspect --format='{{json .Containers}}' bridge
創建容器網絡
使用 docker network create
命令創建容器網絡。
# 語法
[root@localhost ~]# docker network create --help
Usage: docker network create [OPTIONS] NETWORK
Create a network
Options:
--attachable Enable manual container attachment
--aux-address map Auxiliary IPv4 or IPv6 addresses used by Network driver (default map[])
--config-from string The network from which to copy the configuration # 網絡從哪復制配置
--config-only Create a configuration only network # 創建配置唯一網絡
-d, --driver string Driver to manage the Network (default "bridge") # 指定網絡驅動
--gateway strings IPv4 or IPv6 Gateway for the master subnet # 指定子網網關
--ingress Create swarm routing-mesh network
--internal Restrict external access to the network
--ip-range strings Allocate container ip from a sub-range # 指定子網中容器的IP地址范圍
--ipam-driver string IP Address Management Driver (default "default")
--ipam-opt map Set IPAM driver specific options (default map[])
--ipv6 Enable IPv6 networking
--label list Set metadata on a network
-o, --opt map Set driver specific options (default map[])
--scope string Control the network's scope # 控制網絡作用域
--subnet strings Subnet in CIDR format that represents a network segment # 子網
# 案例
[root@localhost ~]# docker network create --driver bridge hqs_net01
00c4ff496a7d44dda7e1913e6119d45064aba010b5210b0afee04c6eedbae6a3
[root@localhost ~]# docker network create --driver bridge --subnet 10.10.1.0/24 --gateway 10.10.1.254 hqs_net02
7fe5768c8e84d3befef561a8632c49bdeb194b440836bf7223d8d37e51ec2c8c
[root@localhost ~]# docker network ls
NETWORK ID NAME DRIVER SCOPE
989e0968a6fe bridge bridge local
76d9e06a3606 host host local
00c4ff496a7d hqs_net01 bridge local
7fe5768c8e84 hqs_net02 bridge local
9f44873071f4 none null local
刪除容器網絡
使用 docker network rm
刪除容器網絡。
# 語法
[root@localhost ~]# docker network rm --help
Usage: docker network rm NETWORK [NETWORK...]
Remove one or more networks
Aliases:
rm, remove
# 案例
[root@localhost ~]# docker network rm c3f9bb71d92e
c3f9bb71d92e
[root@localhost ~]# docker network rm hqs_net01 hqs_net02
hqs_net01
hqs_net02
連接容器網絡
使用 docker network connect
連接容器網絡。
# 語法
[root@localhost ~]# docker network connect --help
Usage: docker network connect [OPTIONS] NETWORK CONTAINER
Connect a container to a network
Options:
--alias strings Add network-scoped # 添加容器網絡域關聯
alias for the container
--driver-opt strings driver options for # 網絡驅動選項
the network
--ip string IPv4 address (e.g., # IPV4地址
172.30.100.104)
--ip6 string IPv6 address (e.g., # IPV6地址
2001:db8::33)
--link list Add link to another # 添加到另一個容器的鏈接
container
--link-local-ip strings Add a link-local # 添加容器本地鏈接地址
address for the
container
# 案例
[root@localhost ~]# docker network connect bridge alpine4
實驗案例
容器連接默認的橋接網絡
創建或啟動容器時不指定網絡,則該容器會被連接到默認橋接網絡。
本實驗,測試同一Docker主機兩個容器間的通信。
# 1.查看當前已有的網絡
[root@localhost ~]# docker network ls
NETWORK ID NAME DRIVER SCOPE
989e0968a6fe bridge bridge local 《————默認橋接網絡
76d9e06a3606 host host local
9f44873071f4 none null local
# 2.啟動兩個運行ash的alpine容器
# alpine鏡像下載
[root@localhost ~]# docker pull alpine
Using default tag: latest
latest: Pulling from library/alpine
df9b9388f04a: Pull complete
Digest: sha256:4edbd2beb5f78b1014028f4fbb99f3237d9561100b6881aabbf5acce2c4f9454
Status: Downloaded newer image for alpine:latest
docker.io/library/alpine:latest
# 啟動容器
[root@localhost ~]# docker run -dti --name alpine1 alpine ash
f5116b60027b745495ad090de3e47e18b7b4ef27dd9529c0fc658f66febac044
[root@localhost ~]# docker run -dti --name alpine2 alpine ash
aa54330101c2bf5b09909ebbfbad18e316e6649305176e57db07842f3735e03f
# 3.檢查容器是否啟動
[root@localhost ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
55f9241be324 alpine "ash" 4 seconds ago Up 3 seconds alpine2
a654ec01f3eb alpine "ash" 7 seconds ago Up 6 seconds alpine1
# 4.查看bridge網絡的詳細信息
[root@localhost ~]# docker network inspect bridge
[
{
"Name": "bridge",
"Id": "989e0968a6fe9b95dd76238e4707f40bc0cf288fd6b764acbd537954fd0e6fcf",
"Created": "2022-04-19T21:56:32.999550849+08:00",
"Scope": "local",
"Driver": "bridge",
"EnableIPv6": false,
"IPAM": {
"Driver": "default",
"Options": null,
"Config": [
{
"Subnet": "172.17.0.0/16",
"Gateway": "172.17.0.1"
}
]
},
"Internal": false,
"Attachable": false,
"Ingress": false,
"ConfigFrom": {
"Network": ""
},
"ConfigOnly": false,
"Containers": {
"55f9241be324d8a2aba1c96c18fd762aa8c5940ff395a01ead8cb9824719b032": {
"Name": "alpine2",
"EndpointID": "c1b5d5ea6e1446b8f934e54a3461197f544eb13ef7f1e7350f6afe8836b7b3a7",
"MacAddress": "02:42:ac:11:00:03",
"IPv4Address": "172.17.0.3/16", 《————第二個容器
"IPv6Address": ""
},
"a654ec01f3eb117fbc4f4248b5e08aceb7ad37efbe7a228d998ac86a13b5a17a": {
"Name": "alpine1",
"EndpointID": "874a9857659ff2ea7d0004826b34058923806cae592951276c78a4f2bb72a391",
"MacAddress": "02:42:ac:11:00:02",
"IPv4Address": "172.17.0.2/16", 《————第一個容器
"IPv6Address": ""
}
},
"Options": {
"com.docker.network.bridge.default_bridge": "true",
"com.docker.network.bridge.enable_icc": "true",
"com.docker.network.bridge.enable_ip_masquerade": "true",
"com.docker.network.bridge.host_binding_ipv4": "0.0.0.0",
"com.docker.network.bridge.name": "docker0",
"com.docker.network.driver.mtu": "1500"
},
"Labels": {}
}
]
...
# 5.docker attach命令連接到alpine1容器
[root@localhost ~]# docker attach alpine1 《————連接到alpine容器
/ # ip addr show 《———— ‘#’說明當前容器用戶以root登錄
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN qlen 1000
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo 《————回環網絡
valid_lft forever preferred_lft forever
19: eth0@if20: <BROADCAST,MULTICAST,UP,LOWER_UP,M-DOWN> mtu 1500 qdisc noqueue state UP
link/ether 02:42:ac:11:00:02 brd ff:ff:ff:ff:ff:ff
inet 172.17.0.2/16 brd 172.17.255.255 scope global eth0 《————地址為172.17.0.2
valid_lft forever preferred_lft forever
/ #
# 6.在alpine1容器ping外網
/ # ping -c 2 www.163.com
PING www.163.com (221.233.240.107): 56 data bytes
64 bytes from 221.233.240.107: seq=0 ttl=127 time=4.929 ms
64 bytes from 221.233.240.107: seq=1 ttl=127 time=5.103 ms
--- www.163.com ping statistics ---
2 packets transmitted, 2 packets received, 0% packet loss
round-trip min/avg/max = 4.929/5.016/5.103 ms
# 7.在alpine1容器ping第二個容器
# (1)ping地址可以通
/ # ping -c 2 172.17.0.3
PING 172.17.0.3 (172.17.0.3): 56 data bytes
64 bytes from 172.17.0.3: seq=0 ttl=64 time=0.065 ms
64 bytes from 172.17.0.3: seq=1 ttl=64 time=0.057 ms
--- 172.17.0.3 ping statistics ---
2 packets transmitted, 2 packets received, 0% packet loss
round-trip min/avg/max = 0.057/0.061/0.065 ms
# (2)ping名稱不能通
/ # ping -c 2 alpine2
ping: bad address 'alpine2'
# 8.離開但不停止容器————輸入 Ctrl+P 和 Ctrl+Q
/ # read escape sequence
[root@localhost ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
55f9241be324 alpine "ash" 9 minutes ago Up 9 minutes alpine2
a654ec01f3eb alpine "ash" 9 minutes ago Up 9 minutes alpine1
# 9.停止並刪除容器
[root@localhost ~]# docker stop alpine1 alpine2
alpine1
alpine2
[root@localhost ~]# docker rm alpine1 alpine2
alpine1
alpine2
使用傳統的容器連接
默認橋接網絡的容器之間只能通過IP地址通信。
如要通過名稱通信,可使用傳統的 --link
選項添加到容器的連接。
本實驗,在兩個容器間建立連接,然后通過連接名稱或別名訪問源容器。
# 1.創建兩個連接默認橋接網絡的容器
[root@localhost ~]# docker run -dti --name alpine1 alpine ash
667caa0d0690c95de34e41bfebaf983e897f3a7e028fda892fca884f1f94dc49
# 創建容器時,添加到第一個容器的連接,並配置別名alp
[root@localhost ~]# docker run -dti --name alpine2 --link alpine1:alp alpine ash
21c0ddd94cb4d7190701d003868caef7cd9f82aded0ae0c5a2e9e68ebb45a03f
# 2.進入alpine2容器測試網絡連通性
[root@localhost ~]# docker attach alpine2
/ # ping -c 2 alpine1
PING alpine1 (172.17.0.2): 56 data bytes
64 bytes from 172.17.0.2: seq=0 ttl=64 time=0.048 ms
64 bytes from 172.17.0.2: seq=1 ttl=64 time=0.056 ms
--- alpine1 ping statistics ---
2 packets transmitted, 2 packets received, 0% packet loss
round-trip min/avg/max = 0.048/0.052/0.056 ms
# 測試后,再通過ctrl+P+Q退出容器。
# 3.進入alpine1容器測試網絡連通性
[root@localhost ~]# docker attach alpine1
/ # ping -c 2 alpine2
ping: bad address 'alpine2'
# 失敗原因:--link只添加了單向通信,接受容器可以通過名稱訪問源容器,源容器不能通過名稱訪問接收容器。
# 測試后,再通過ctrl+P+Q退出容器。
# 4.刪除容器恢復環境
[root@localhost ~]# docker rm -f $(docker ps -aq)
21c0ddd94cb4
667caa0d0690
創建用戶自定義橋接網絡並連接容器
實驗:示范如何將容器連接到用戶自定義橋接網絡,並驗證容器間的連通性。
在自定義橋接網絡中,容器不僅能通過IP地址進行通信,還能將容器名稱解析到IP地址,此功能稱為自動服務發現(Automatic Service Discovery)。
# 1.創建用戶自定義橋接網絡
[root@localhost ~]# docker network create --driver bridge alpine-net
9e8a13047a172f4d3c8cdb10d16291f6889f40c4ea7e790e49e11dd6e6e7d00c
# 2.查看當前docker主機的網絡
[root@localhost ~]# docker network ls
NETWORK ID NAME DRIVER SCOPE
9e8a13047a17 alpine-net bridge local
# 查看新網絡的詳細信息
[root@localhost ~]# docker network inspect alpine-net
[
{
"Name": "alpine-net",
"Id": "9e8a13047a172f4d3c8cdb10d16291f6889f40c4ea7e790e49e11dd6e6e7d00c",
"Created": "2022-04-20T16:59:22.055790409+08:00",
"Scope": "local",
"Driver": "bridge",
"EnableIPv6": false,
"IPAM": {
"Driver": "default",
"Options": {},
"Config": [
{
"Subnet": "172.18.0.0/16", 《————子網
"Gateway": "172.18.0.1" 《————網關
}
]
},
"Internal": false,
"Attachable": false,
"Ingress": false,
"ConfigFrom": {
"Network": ""
},
"ConfigOnly": false,
"Containers": {},
"Options": {},
"Labels": {}
}
]
# 3.創建四個容器
# (1)2個只連接用戶自定義橋接網絡
[root@localhost ~]# docker run -dti --name alpine1 --network alpine-net alpine ash
22af8e376fef34108cf2058810b7edd05c148314354341c067ff45d6e7437f46
[root@localhost ~]# docker run -dti --name alpine2 --network alpine-net alpine ash
26f211048d9d857029ee9e038918c38b9ae19f698e1806adbc78ed0aca6f1aff
# (2)1個只連接默認橋接網絡
[root@localhost ~]# docker run -dti --name alpine3 alpine ash
1078e18ff3a2d84b2ea97a612fd577ef142e5a954753169e95c4d9b2bd337c41
# (3)1個同時連接默認橋接網絡和用戶自定義網絡
# docker run 命令執行只能連接一個網絡
[root@localhost ~]# docker run -dti --name alpine4 --network alpine-net alpine ash
4b63cd8a7a1efcbeabcdfd12fdb8881d35ffe72e66ddec15fdf64825dcb1cf6a
# connet命令連接第二個網絡
[root@localhost ~]# docker network connect bridge alpine4
# (4)查看當前正在運行的容器
[root@localhost ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
4b63cd8a7a1e alpine "ash" 2 minutes ago Up 2 minutes alpine4
1078e18ff3a2 alpine "ash" 3 minutes ago Up 3 minutes alpine3
26f211048d9d alpine "ash" 4 minutes ago Up 4 minutes alpine2
22af8e376fef alpine "ash" 4 minutes ago Up 4 minutes alpine1
# 4.查看bridge網絡和alpine-net網絡信息
# 查看bridge網絡
[root@localhost ~]# docker network inspect bridge
[
{
"Name": "bridge",
"Id": "aefaa402b60d4b6f7f2515575ba2720f98eb8fd0c1ead0a8572442c098e52ed5",
"Created": "2022-04-20T15:52:23.173167512+08:00",
"Scope": "local",
"Driver": "bridge",
"EnableIPv6": false,
"IPAM": {
"Driver": "default",
"Options": null,
"Config": [
{
"Subnet": "172.17.0.0/16",
"Gateway": "172.17.0.1"
}
]
},
"Internal": false,
"Attachable": false,
"Ingress": false,
"ConfigFrom": {
"Network": ""
},
"ConfigOnly": false,
"Containers": {
"1078e18ff3a2d84b2ea97a612fd577ef142e5a954753169e95c4d9b2bd337c41": {
"Name": "alpine3",
"EndpointID": "1e19495d48d8e83cff4add4d8ad1570b24068fec17824cf4f499c56010831e52",
"MacAddress": "02:42:ac:11:00:02",
"IPv4Address": "172.17.0.2/16",
"IPv6Address": ""
},
"4b63cd8a7a1efcbeabcdfd12fdb8881d35ffe72e66ddec15fdf64825dcb1cf6a": {
"Name": "alpine4",
"EndpointID": "d2cb2c81fe71d54c3fc39782755f0b0c86ce415c67205c159bf16fe3ebd76c24",
"MacAddress": "02:42:ac:11:00:03",
"IPv4Address": "172.17.0.3/16",
"IPv6Address": ""
}
},
"Options": {
"com.docker.network.bridge.default_bridge": "true",
"com.docker.network.bridge.enable_icc": "true",
"com.docker.network.bridge.enable_ip_masquerade": "true",
"com.docker.network.bridge.host_binding_ipv4": "0.0.0.0",
"com.docker.network.bridge.name": "docker0",
"com.docker.network.driver.mtu": "1500"
},
"Labels": {}
}
]
# 查看alpine-net網絡
[root@localhost ~]# docker network inspect alpine-net
[
{
"Name": "alpine-net",
"Id": "9e8a13047a172f4d3c8cdb10d16291f6889f40c4ea7e790e49e11dd6e6e7d00c",
"Created": "2022-04-20T16:59:22.055790409+08:00",
"Scope": "local",
"Driver": "bridge",
"EnableIPv6": false,
"IPAM": {
"Driver": "default",
"Options": {},
"Config": [
{
"Subnet": "172.18.0.0/16",
"Gateway": "172.18.0.1"
}
]
},
"Internal": false,
"Attachable": false,
"Ingress": false,
"ConfigFrom": {
"Network": ""
},
"ConfigOnly": false,
"Containers": {
"22af8e376fef34108cf2058810b7edd05c148314354341c067ff45d6e7437f46": {
"Name": "alpine1",
"EndpointID": "b2f1d6d2ebf8cce71dddf0b23fb941d17a4d3e0c757bf33604d6d57f8b801665",
"MacAddress": "02:42:ac:12:00:02",
"IPv4Address": "172.18.0.2/16",
"IPv6Address": ""
},
"26f211048d9d857029ee9e038918c38b9ae19f698e1806adbc78ed0aca6f1aff": {
"Name": "alpine2",
"EndpointID": "01a8b99524d4db9a820ffede79fbcc0b95ccc1c00ab2d87a9a236c9f67c04dec",
"MacAddress": "02:42:ac:12:00:03",
"IPv4Address": "172.18.0.3/16",
"IPv6Address": ""
},
"4b63cd8a7a1efcbeabcdfd12fdb8881d35ffe72e66ddec15fdf64825dcb1cf6a": {
"Name": "alpine4",
"EndpointID": "c79921b791e45fc22dc8b3b3df06ffe45ffe97f8999a724c51bd8c53d358ebb0",
"MacAddress": "02:42:ac:12:00:04",
"IPv4Address": "172.18.0.4/16",
"IPv6Address": ""
}
},
"Options": {},
"Labels": {}
}
]
# 5、alpine1網絡測試
[root@localhost ~]# docker attach alpine1
/ # ping -c 2 alpine2
PING alpine2 (172.18.0.3): 56 data bytes
64 bytes from 172.18.0.3: seq=0 ttl=64 time=0.063 ms 《————用戶自定義網絡,支持自動服務發現
64 bytes from 172.18.0.3: seq=1 ttl=64 time=0.054 ms
--- alpine2 ping statistics ---
2 packets transmitted, 2 packets received, 0% packet loss
round-trip min/avg/max = 0.054/0.058/0.063 ms
/ # ping -c 2 alpine4
PING alpine4 (172.18.0.4): 56 data bytes
64 bytes from 172.18.0.4: seq=0 ttl=64 time=0.060 ms 《————用戶自定義網絡,支持自動服務發現
64 bytes from 172.18.0.4: seq=1 ttl=64 time=0.055 ms
--- alpine4 ping statistics ---
2 packets transmitted, 2 packets received, 0% packet loss
round-trip min/avg/max = 0.055/0.057/0.060 ms
/ # ping -c 2 alpine3
ping: bad address 'alpine3' 《————alpine3不在用戶自定義網絡alpine-net中
/ # ping -c 2 172.17.0.2 《————不在一個網絡中,名稱和IP都不能ping通
PING 172.17.0.2 (172.17.0.2): 56 data bytes
--- 172.17.0.2 ping statistics ---
2 packets transmitted, 0 packets received, 100% packet loss
/ # ping www.baidu.com
PING www.baidu.com (103.235.46.39): 56 data bytes
64 bytes from 103.235.46.39: seq=0 ttl=127 time=248.724 ms
64 bytes from 103.235.46.39: seq=2 ttl=127 time=259.902 m
# 測試后,再通過ctrl+P+Q退出容器alpine1。
# 6.alpine4網絡測試
# alpine4既連接了默認橋接網絡,也連接了alpine-net網絡,可以訪問所有的容器。
[root@localhost ~]# docker attach alpine4
/ # ping -c 2 alpine1
PING alpine1 (172.18.0.2): 56 data bytes
64 bytes from 172.18.0.2: seq=0 ttl=64 time=0.046 ms 《————用戶自定義網絡,支持自動服務發現
64 bytes from 172.18.0.2: seq=1 ttl=64 time=0.052 ms
--- alpine1 ping statistics ---
2 packets transmitted, 2 packets received, 0% packet loss
round-trip min/avg/max = 0.046/0.049/0.052 ms
/ # ping -c 2 alpine2
PING alpine2 (172.18.0.3): 56 data bytes
64 bytes from 172.18.0.3: seq=0 ttl=64 time=0.058 ms 《————用戶自定義網絡,支持自動服務發現
64 bytes from 172.18.0.3: seq=1 ttl=64 time=0.053 ms
--- alpine2 ping statistics ---
2 packets transmitted, 2 packets received, 0% packet loss
round-trip min/avg/max = 0.053/0.055/0.058 ms
/ # ping -c 2 alpine3 《————alpine3為默認橋接網絡,不支持自動服務發現
ping: bad address 'alpine3'
/ # ping -c 2 172.17.0.2
PING 172.17.0.2 (172.17.0.2): 56 data bytes
64 bytes from 172.17.0.2: seq=0 ttl=64 time=0.065 ms 《————alpine3為默認橋接網絡,支持地址ping通
64 bytes from 172.17.0.2: seq=1 ttl=64 time=0.060 ms
--- 172.17.0.2 ping statistics ---
2 packets transmitted, 2 packets received, 0% packet loss
round-trip min/avg/max = 0.060/0.062/0.065 ms
/ # ping -c 2 www.baidu.com
PING www.baidu.com (14.215.177.38): 56 data bytes
64 bytes from 14.215.177.38: seq=0 ttl=127 time=29.962 ms 《————能訪問外網
64 bytes from 14.215.177.38: seq=1 ttl=127 time=30.115 ms
--- www.baidu.com ping statistics ---
2 packets transmitted, 2 packets received, 0% packet loss
round-trip min/avg/max = 29.962/30.038/30.115 ms
7.清理環境
[root@localhost ~]# docker rm -f $(docker ps -qa)
4b63cd8a7a1e
1078e18ff3a2
26f211048d9d
22af8e376fef
[root@localhost ~]# docker network rm alpine-net
alpine-net