本文提供可用于與Docker網(wǎng)絡(luò)及與網(wǎng)絡(luò)中容器進行交互的network子命令的示例。這些命令可通過Docker Engine CLI獲得刚操。 這些命令是:
docker network create
docker network connect
docker network ls
docker network rm
docker network disconnect
docker network inspect
雖然不是必需的闸翅,但在嘗試本節(jié)中的示例之前,先閱讀 了解Docker網(wǎng)絡(luò) 更佳菊霜。 示例使用默認bridge
網(wǎng)絡(luò)以便您可以立即嘗試坚冀。要實驗overlay
網(wǎng)絡(luò),請參閱 多主機網(wǎng)絡(luò)入門指南 鉴逞。
創(chuàng)建網(wǎng)絡(luò)
Docker Engine在安裝時自動創(chuàng)建bridge
網(wǎng)絡(luò)记某。 該網(wǎng)絡(luò)對應(yīng)于Engine傳統(tǒng)依賴的docker0
網(wǎng)橋。除該網(wǎng)絡(luò)外构捡,也可創(chuàng)建自己的bridge
或overlay
網(wǎng)絡(luò)液南。
bridge
網(wǎng)絡(luò)駐留在運行Docker Engine實例的單個主機上。 overlay
網(wǎng)絡(luò)可跨越運行Docker Engine的多個主機勾徽。 如果您運行docker network create
并僅提供網(wǎng)絡(luò)名稱滑凉,它將為您創(chuàng)建一個橋接網(wǎng)絡(luò)。
$ docker network create simple-network
69568e6336d8c96bbf57869030919f7c69524f71183b44d80948bd3927c87f6a
$ docker network inspect simple-network
[
{
"Name": "simple-network",
"Id": "69568e6336d8c96bbf57869030919f7c69524f71183b44d80948bd3927c87f6a",
"Scope": "local",
"Driver": "bridge",
"IPAM": {
"Driver": "default",
"Config": [
{
"Subnet": "172.22.0.0/16",
"Gateway": "172.22.0.1"
}
]
},
"Containers": {},
"Options": {},
"Labels": {}
}
]
與bridge
網(wǎng)絡(luò)不同喘帚, overlay
網(wǎng)絡(luò)需要一些預(yù)制條件才能創(chuàng)建——
- 訪問key-value存儲畅姊。 引擎支持Consul,Etcd和ZooKeeper(分布式存儲)key-value存儲吹由。
- 與key-value存儲連接的主機集群若未。
- 在swarm中的每個主機上正確配置的
Docker daemon
。
支持overlay
網(wǎng)絡(luò)的dockerd
選項有:
--cluster-store
--cluster-store-opt
--cluster-advertise
在創(chuàng)建網(wǎng)絡(luò)時倾鲫,Docker引擎默認會為網(wǎng)絡(luò)創(chuàng)建一個不重疊的子網(wǎng)粗合。 您可以覆蓋此默認值,并使用--subnet
選項直接指定子網(wǎng)级乍。 對于bridge
網(wǎng)絡(luò)舌劳,只可指定一個子網(wǎng)。 overlay
網(wǎng)絡(luò)支持多個子網(wǎng)玫荣。
注意 :強烈建議在創(chuàng)建網(wǎng)絡(luò)時使用
--subnet
選項甚淡。 如果未指定--subnet
則Docker daemon會自動為網(wǎng)絡(luò)選擇并分配子網(wǎng),這可能會導(dǎo)致與您基礎(chǔ)結(jié)構(gòu)中的另一個子網(wǎng)(該子網(wǎng)不受--subnet
管理)重疊捅厂。 當(dāng)容器連接到該網(wǎng)絡(luò)時贯卦,這種重疊可能導(dǎo)致連接問題或故障。
除--subnet
選項以外焙贷,您還可以指定--gateway
撵割, --ip-range
--gateway
--ip-range
和--aux-address
選項。
$ docker network create -d overlay \
--subnet=192.168.0.0/16 \
--subnet=192.170.0.0/16 \
--gateway=192.168.0.100 \
--gateway=192.170.0.100 \
--ip-range=192.168.1.0/24 \
--aux-address="my-router=192.168.1.5" --aux-address="my-switch=192.168.1.6" \
--aux-address="my-printer=192.170.1.5" --aux-address="my-nas=192.170.1.6" \
my-multihost-network
確保您的子網(wǎng)不重疊辙芍。 如果重疊啡彬,那么網(wǎng)絡(luò)將會創(chuàng)建失敗羹与,Docker Engine返回錯誤。
創(chuàng)建自定義網(wǎng)絡(luò)時庶灿,您可以向驅(qū)動傳遞其他選項纵搁。 bridge
驅(qū)動程序接受以下選項:
Option | Equivalent | Description |
---|---|---|
com.docker.network.bridge.name |
- | 創(chuàng)建Linux網(wǎng)橋時要使用的網(wǎng)橋名稱 |
com.docker.network.bridge.enable_ip_masquerade |
--ip-masq |
啟用IP偽裝 |
com.docker.network.bridge.enable_icc |
--icc |
啟用或禁用跨容器連接 |
com.docker.network.bridge.host_binding_ipv4 |
--ip |
綁定容器端口時的默認IP |
com.docker.network.driver.mtu |
--mtu |
設(shè)置容器網(wǎng)絡(luò)MTU |
overlay
驅(qū)動也支持com.docker.network.driver.mtu
選項。
以下參數(shù)可以傳遞給任何網(wǎng)絡(luò)驅(qū)動的docker network create
往踢。
Argument | Equivalent | Description |
---|---|---|
--internal |
- | 限制對網(wǎng)絡(luò)的外部訪問 |
--ipv6 |
--ipv6 |
啟用IPv6網(wǎng)絡(luò) |
以下示例使用-o
選項腾誉,在綁定端口時綁定到指定的IP地址,然后使用docker network inspect
來檢查網(wǎng)絡(luò)峻呕,最后將新容器attach到新網(wǎng)絡(luò)利职。
$ docker network create -o "com.docker.network.bridge.host_binding_ipv4"="172.23.0.1" my-network
b1a086897963e6a2e7fc6868962e55e746bee8ad0c97b54a5831054b5f62672a
$ docker network inspect my-network
[
{
"Name": "my-network",
"Id": "b1a086897963e6a2e7fc6868962e55e746bee8ad0c97b54a5831054b5f62672a",
"Scope": "local",
"Driver": "bridge",
"IPAM": {
"Driver": "default",
"Options": {},
"Config": [
{
"Subnet": "172.23.0.0/16",
"Gateway": "172.23.0.1"
}
]
},
"Containers": {},
"Options": {
"com.docker.network.bridge.host_binding_ipv4": "172.23.0.1"
},
"Labels": {}
}
]
$ docker run -d -P --name redis --network my-network redis
bafb0c808c53104b2c90346f284bda33a69beadcab4fc83ab8f2c5a4410cd129
$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
bafb0c808c53 redis "/entrypoint.sh redis" 4 seconds ago Up 3 seconds 172.23.0.1:32770->6379/tcp redis
連接容器
您可以將一個現(xiàn)有容器連接到一個或多個網(wǎng)絡(luò)。 容器可連接到使用不同網(wǎng)絡(luò)驅(qū)動的網(wǎng)絡(luò)瘦癌。 一旦連接猪贪,容器即可使用另一個容器的IP地址或名稱進行通信。
對于支持多主機連接的overlay
網(wǎng)絡(luò)或自定義插件佩憾,不同主機上的容器哮伟,只要連接到同一multi-host network多主機網(wǎng)絡(luò),也可以這種方式進行通信妄帘。
此示例使用六個容器楞黄,并指示您根據(jù)需要創(chuàng)建它們。
基本容器網(wǎng)絡(luò)示例
-
首先抡驼,創(chuàng)建并運行兩個容器鬼廓,
container1
和container2
:$ docker run -itd --name=container1 busybox 18c062ef45ac0c026ee48a83afa39d25635ee5f02b58de4abc8f467bcaa28731 $ docker run -itd --name=container2 busybox 498eaaaf328e1018042c04b2de04036fc04719a6e39a097a4f4866043a2c2152
-
創(chuàng)建一個隔離的
bridge
網(wǎng)絡(luò)進行測試。$ docker network create -d bridge --subnet 172.25.0.0/16 isolated_nw 06a62f1c73c4e3107c0f555b7a5f163309827bfbbf999840166065a8f35455a8
-
將
container2
連接到網(wǎng)絡(luò)致盟,然后inspect
網(wǎng)絡(luò)以驗證連接:$ docker network connect isolated_nw container2 $ docker network inspect isolated_nw [ { "Name": "isolated_nw", "Id": "06a62f1c73c4e3107c0f555b7a5f163309827bfbbf999840166065a8f35455a8", "Scope": "local", "Driver": "bridge", "IPAM": { "Driver": "default", "Config": [ { "Subnet": "172.25.0.0/16", "Gateway": "172.25.0.1/16" } ] }, "Containers": { "90e1f3ec71caf82ae776a827e0712a68a110a3f175954e5bd4222fd142ac9428": { "Name": "container2", "EndpointID": "11cedac1810e864d6b1589d92da12af66203879ab89f4ccd8c8fdaa9b1c48b1d", "MacAddress": "02:42:ac:19:00:02", "IPv4Address": "172.25.0.2/16", "IPv6Address": "" } }, "Options": {} } ]
請注意碎税,
container2
自動分配了一個IP地址。 因為在創(chuàng)建網(wǎng)絡(luò)時指定了--subnet
選項馏锡,所以IP地址會從該子網(wǎng)選擇雷蹂。作為提醒,
container1
僅連接到默認bridge
杯道。 -
啟動第三個容器匪煌,但這次使用
--ip
標(biāo)志分配一個IP地址,并使用docker run
命令的--network
選項將其連接到--isolated_nw
網(wǎng)絡(luò):$ docker run --network=isolated_nw --ip=172.25.3.3 -itd --name=container3 busybox 467a7863c3f0277ef8e661b38427737f28099b61fa55622d6c30fb288d88c551
只要您為容器指定的IP地址是如上子網(wǎng)的一部分党巾,那就可使用
--ip
或--ip6
標(biāo)志將IPv4或IPv6地址分配給容器萎庭,將其連接到以上網(wǎng)絡(luò)。 當(dāng)您在使用用戶自定義的網(wǎng)絡(luò)時以這種方式指定IP地址時齿拂,配置將作為容器配置的一部分進行保留驳规,并在容器重新加載時進行應(yīng)用。 使用非用戶自定義網(wǎng)絡(luò)時署海,分配的IP地址將被保留吗购,因為不保證Docker daemon重啟時容器的子網(wǎng)不會改變医男,除非您使用用戶定義的網(wǎng)絡(luò)」【這一段官方文檔是不是有問題昨登?趾代?贯底?】 -
檢查
container3
所使用的網(wǎng)絡(luò)資源。 簡潔起見撒强,截斷以下輸出禽捆。$ docker inspect --format='' container3 {"isolated_nw": {"IPAMConfig": { "IPv4Address":"172.25.3.3"}, "NetworkID":"1196a4c5af43a21ae38ef34515b6af19236a3fc48122cf585e3f3054d509679b", "EndpointID":"dffc7ec2915af58cc827d995e6ebdc897342be0420123277103c40ae35579103", "Gateway":"172.25.0.1", "IPAddress":"172.25.3.3", "IPPrefixLen":16, "IPv6Gateway":"", "GlobalIPv6Address":"", "GlobalIPv6PrefixLen":0, "MacAddress":"02:42:ac:19:03:03"} } } }
因為在啟動時將
container3
連接到isolated_nw
,所以它根本沒有連接到默認的bridge
網(wǎng)絡(luò)飘哨。 -
檢查
container2
所使用的網(wǎng)絡(luò)胚想。 如果你安裝了Python,你可以打印輸出格式化芽隆。$ docker inspect --format='' container2 | python -m json.tool { "bridge": { "NetworkID":"7ea29fc1412292a2d7bba362f9253545fecdfa8ce9a6e37dd10ba8bee7129812", "EndpointID": "0099f9efb5a3727f6a554f176b1e96fca34cae773da68b3b6a26d046c12cb365", "Gateway": "172.17.0.1", "GlobalIPv6Address": "", "GlobalIPv6PrefixLen": 0, "IPAMConfig": null, "IPAddress": "172.17.0.3", "IPPrefixLen": 16, "IPv6Gateway": "", "MacAddress": "02:42:ac:11:00:03" }, "isolated_nw": { "NetworkID":"1196a4c5af43a21ae38ef34515b6af19236a3fc48122cf585e3f3054d509679b", "EndpointID": "11cedac1810e864d6b1589d92da12af66203879ab89f4ccd8c8fdaa9b1c48b1d", "Gateway": "172.25.0.1", "GlobalIPv6Address": "", "GlobalIPv6PrefixLen": 0, "IPAMConfig": null, "IPAddress": "172.25.0.2", "IPPrefixLen": 16, "IPv6Gateway": "", "MacAddress": "02:42:ac:19:00:02" } }
請注意浊服,
container2
屬于兩個網(wǎng)絡(luò)。 當(dāng)您啟動它時胚吁,它加入了默認bridge
網(wǎng)絡(luò)牙躺,并在步驟3中將其連接到isolated_nw
。eth0 Link encap:Ethernet HWaddr 02:42:AC:11:00:03
eth1 Link encap:Ethernet HWaddr 02:42:AC:15:00:02
-
使用
docker attach
命令連接到正在運行的container2
并檢查它的網(wǎng)絡(luò)堆棧:$ docker attach container2
使用
ifconfig
命令檢查容器的網(wǎng)絡(luò)堆棧腕扶。 您應(yīng)該看到兩個以太網(wǎng)卡孽拷,一個用于默認bridge
,另一個用于isolated_nw
網(wǎng)絡(luò)半抱。$ sudo ifconfig -a eth0 Link encap:Ethernet HWaddr 02:42:AC:11:00:03 inet addr:172.17.0.3 Bcast:0.0.0.0 Mask:255.255.0.0 inet6 addr: fe80::42:acff:fe11:3/64 Scope:Link UP BROADCAST RUNNING MULTICAST MTU:9001 Metric:1 RX packets:8 errors:0 dropped:0 overruns:0 frame:0 TX packets:8 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 txqueuelen:0 RX bytes:648 (648.0 B) TX bytes:648 (648.0 B) eth1 Link encap:Ethernet HWaddr 02:42:AC:15:00:02 inet addr:172.25.0.2 Bcast:0.0.0.0 Mask:255.255.0.0 inet6 addr: fe80::42:acff:fe19:2/64 Scope:Link UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1 RX packets:8 errors:0 dropped:0 overruns:0 frame:0 TX packets:8 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 txqueuelen:0 RX bytes:648 (648.0 B) TX bytes:648 (648.0 B) lo Link encap:Local Loopback inet addr:127.0.0.1 Mask:255.0.0.0 inet6 addr: ::1/128 Scope:Host UP LOOPBACK RUNNING MTU:65536 Metric:1 RX packets:0 errors:0 dropped:0 overruns:0 frame:0 TX packets:0 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 txqueuelen:0 RX bytes:0 (0.0 B) TX bytes:0 (0.0 B)
-
Docker內(nèi)嵌DNS服務(wù)器可使用容器名稱解析連接到給定網(wǎng)絡(luò)的容器脓恕。 這意味著網(wǎng)絡(luò)內(nèi)的容器可以通過容器名稱ping在同一網(wǎng)絡(luò)中的另一個容器。 例如窿侈,從
container2
可以按名稱pingcontainer3
炼幔。/ # ping -w 4 container3 PING container3 (172.25.3.3): 56 data bytes 64 bytes from 172.25.3.3: seq=0 ttl=64 time=0.070 ms 64 bytes from 172.25.3.3: seq=1 ttl=64 time=0.080 ms 64 bytes from 172.25.3.3: seq=2 ttl=64 time=0.080 ms 64 bytes from 172.25.3.3: seq=3 ttl=64 time=0.097 ms --- container3 ping statistics --- 4 packets transmitted, 4 packets received, 0% packet loss round-trip min/avg/max = 0.070/0.081/0.097 ms
此功能不適用于默認
bridge
網(wǎng)絡(luò)。container1
和container2
都連接到默認的bridge
網(wǎng)絡(luò)史简,但是并不能使用容器名稱從container2
pingcontainer1
乃秀。/ # ping -w 4 container1 ping: bad address 'container1'
但依然可直接ping IP地址:
/ # ping -w 4 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.095 ms 64 bytes from 172.17.0.2: seq=1 ttl=64 time=0.075 ms 64 bytes from 172.17.0.2: seq=2 ttl=64 time=0.072 ms 64 bytes from 172.17.0.2: seq=3 ttl=64 time=0.101 ms --- 172.17.0.2 ping statistics --- 4 packets transmitted, 4 packets received, 0% packet loss round-trip min/avg/max = 0.072/0.085/0.101 ms
離開
container2
容器,并使用CTRL-p CTRL-q
保持容器運行乘瓤。 -
當(dāng)前环形,
container2
連接到默認bridge
網(wǎng)絡(luò)和isolated_nw
網(wǎng)絡(luò),因此衙傀,container2
可與container1
以及container3
進行通信抬吟。 但是,container3
和container1
沒有任何共同的網(wǎng)絡(luò)统抬,所以它們不能通信火本。 要驗證這一點危队,請附加到container3
并嘗試通過IP地址pingcontainer1
。$ docker attach container3 $ ping 172.17.0.2 PING 172.17.0.2 (172.17.0.2): 56 data bytes ^C --- 172.17.0.2 ping statistics --- 10 packets transmitted, 0 packets received, 100% packet loss
離開
container3
容器钙畔,并使用CTRL-p CTRL-q
保持容器運行茫陆。
即使容器未運行,也可以將容器連接到網(wǎng)絡(luò)擎析。 但是簿盅,
docker network inspect
僅顯示運行容器的信息。
鏈接容器而不使用用戶定義的網(wǎng)絡(luò)
完成基本容器網(wǎng)絡(luò)示例中的步驟后揍魂, container2
可以自動解析container3
的名稱桨醋,因為兩個容器都連接到isolated_nw
網(wǎng)絡(luò)。 但是现斋,連接到默認bridge
的容器無法解析彼此的容器名稱喜最。 如果您需要容器能夠通過bridge
網(wǎng)絡(luò)進行通信,則需要使用遺留的連接功能庄蹋。 這是唯一的建議使用--link
的情況瞬内。 您應(yīng)該強烈地考慮使用用戶定義的網(wǎng)絡(luò)。
使用遺留的link
標(biāo)志為可為默認的bridge
網(wǎng)絡(luò)添加以下功能進行通信:
- 將容器名稱解析為IP地址的能力
- 使用
--link=CONTAINER-NAME:ALIAS
定義一個網(wǎng)絡(luò)別名去連接容器的能力 - 安全的容器連接(通過
--icc=false
隔離) - 環(huán)境變量注入
需要重申的是限书,當(dāng)您使用用戶自定義網(wǎng)絡(luò)時虫蝶,默認情況下提供所有這些功能,無需額外的配置蔗包。 此外秉扑,您可以動態(tài)attach到多個網(wǎng)絡(luò),也可動態(tài)從多個網(wǎng)絡(luò)中離開调限。
- 使用DNS進行自動名稱解析
- 支持
--link
選項為鏈接的容器提供名稱別名 - 網(wǎng)絡(luò)中容器的自動安全隔離環(huán)境
- 環(huán)境變量注入
以下示例簡要介紹如何使用--link
舟陆。
-
繼續(xù)上面的例子,創(chuàng)建一個新的容器
container4
耻矮,并將其連接到網(wǎng)絡(luò)isolated_nw
秦躯。 另外,使用--link
標(biāo)志鏈接到容器container5
(不存在q勺啊)踱承!$ docker run --network=isolated_nw -itd --name=container4 --link container5:c5 busybox 01b5df970834b77a9eadbaff39051f237957bd35c4c56f11193e0594cfd5117c
這有點棘手,因為
container5
還不存在哨免。 當(dāng)container5
被創(chuàng)建時茎活,container4
將能夠?qū)⒚Qc5
解析為container5
的IP地址。注意 :使用遺留的link功能創(chuàng)建的容器之間的任何鏈接本質(zhì)上都是靜態(tài)的琢唾,并且通過別名強制綁定容器载荔。 它無法容忍鏈接的容器重新啟動。 用戶自定義網(wǎng)絡(luò)中的新鏈接功能支持容器之間的動態(tài)鏈接采桃,并且允許鏈接容器中的重新啟動和IP地址更改懒熙。
由于您尚未創(chuàng)建容器
container5
嘗試ping它將導(dǎo)致錯誤丘损。 attach到container4
并嘗試ping任何container5
或c5
:$ docker attach container4 $ ping container5 ping: bad address 'container5' $ ping c5 ping: bad address 'c5'
從
container4
離開,并使用CTRL-p CTRL-q
使其保持運行工扎。 -
創(chuàng)建一個容器徘钥,名為
container5
,并使用別名c4
將其鏈接到container4
肢娘。$ docker run --network=isolated_nw -itd --name=container5 --link container4:c4 busybox 72eccf2208336f31e9e33ba327734125af00d1e1d2657878e2ee8154fbb23c7a
現(xiàn)在attach到
container4
呈础,嘗試pingc5
和container5
。$ docker attach container4 / # ping -w 4 c5 PING c5 (172.25.0.5): 56 data bytes 64 bytes from 172.25.0.5: seq=0 ttl=64 time=0.070 ms 64 bytes from 172.25.0.5: seq=1 ttl=64 time=0.080 ms 64 bytes from 172.25.0.5: seq=2 ttl=64 time=0.080 ms 64 bytes from 172.25.0.5: seq=3 ttl=64 time=0.097 ms --- c5 ping statistics --- 4 packets transmitted, 4 packets received, 0% packet loss round-trip min/avg/max = 0.070/0.081/0.097 ms / # ping -w 4 container5 PING container5 (172.25.0.5): 56 data bytes 64 bytes from 172.25.0.5: seq=0 ttl=64 time=0.070 ms 64 bytes from 172.25.0.5: seq=1 ttl=64 time=0.080 ms 64 bytes from 172.25.0.5: seq=2 ttl=64 time=0.080 ms 64 bytes from 172.25.0.5: seq=3 ttl=64 time=0.097 ms --- container5 ping statistics --- 4 packets transmitted, 4 packets received, 0% packet loss round-trip min/avg/max = 0.070/0.081/0.097 ms
從
container4
分離蔬浙,并使用CTRL-p CTRL-q
使其保持運行猪落。 -
最后,附加到
container5
畴博,驗證你可以pingcontainer4
。$ docker attach container5 / # ping -w 4 c4 PING c4 (172.25.0.4): 56 data bytes 64 bytes from 172.25.0.4: seq=0 ttl=64 time=0.065 ms 64 bytes from 172.25.0.4: seq=1 ttl=64 time=0.070 ms 64 bytes from 172.25.0.4: seq=2 ttl=64 time=0.067 ms 64 bytes from 172.25.0.4: seq=3 ttl=64 time=0.082 ms --- c4 ping statistics --- 4 packets transmitted, 4 packets received, 0% packet loss round-trip min/avg/max = 0.065/0.070/0.082 ms / # ping -w 4 container4 PING container4 (172.25.0.4): 56 data bytes 64 bytes from 172.25.0.4: seq=0 ttl=64 time=0.065 ms 64 bytes from 172.25.0.4: seq=1 ttl=64 time=0.070 ms 64 bytes from 172.25.0.4: seq=2 ttl=64 time=0.067 ms 64 bytes from 172.25.0.4: seq=3 ttl=64 time=0.082 ms --- container4 ping statistics --- 4 packets transmitted, 4 packets received, 0% packet loss round-trip min/avg/max = 0.065/0.070/0.082 ms
從
container5
離開蓝仲,并使用CTRL-p CTRL-q
使其保持運行俱病。
網(wǎng)絡(luò)范圍的別名示例
鏈接容器時,無論是使用遺留的link
方法還是使用用戶自定義網(wǎng)絡(luò)袱结,您指定的任何別名只對指定的容器有意義亮隙,并且不能在默認bridge
上的其他容器上運行。
另外垢夹,如果容器屬于多個網(wǎng)絡(luò)溢吻,則給定的鏈接別名與給定的網(wǎng)絡(luò)范圍一致。 因此果元,容器可以鏈接到不同網(wǎng)絡(luò)中的不同別名促王,并且別名將不適用于不在同一網(wǎng)絡(luò)上的容器。
以下示例說明了這些要點而晒。
-
創(chuàng)建另一個名為
local_alias
網(wǎng)絡(luò):$ docker network create -d bridge --subnet 172.26.0.0/24 local_alias 76b7dc932e037589e6553f59f76008e5b76fa069638cd39776b890607f567aaa
-
接下來蝇狼,使用別名
foo
和bar
將container4
和container5
連接到新的網(wǎng)絡(luò)local_alias
:$ docker network connect --link container5:foo local_alias container4 $ docker network connect --link container4:bar local_alias container5
-
attach到
container4
并嘗試使用別名foo
pingcontainer4
(是的,同一個)倡怎,然后嘗試使用別名c5
ping容器container5
:$ docker attach container4 / # ping -w 4 foo PING foo (172.26.0.3): 56 data bytes 64 bytes from 172.26.0.3: seq=0 ttl=64 time=0.070 ms 64 bytes from 172.26.0.3: seq=1 ttl=64 time=0.080 ms 64 bytes from 172.26.0.3: seq=2 ttl=64 time=0.080 ms 64 bytes from 172.26.0.3: seq=3 ttl=64 time=0.097 ms --- foo ping statistics --- 4 packets transmitted, 4 packets received, 0% packet loss round-trip min/avg/max = 0.070/0.081/0.097 ms / # ping -w 4 c5 PING c5 (172.25.0.5): 56 data bytes 64 bytes from 172.25.0.5: seq=0 ttl=64 time=0.070 ms 64 bytes from 172.25.0.5: seq=1 ttl=64 time=0.080 ms 64 bytes from 172.25.0.5: seq=2 ttl=64 time=0.080 ms 64 bytes from 172.25.0.5: seq=3 ttl=64 time=0.097 ms --- c5 ping statistics --- 4 packets transmitted, 4 packets received, 0% packet loss round-trip min/avg/max = 0.070/0.081/0.097 ms
兩個ping都成功了迅耘,但子網(wǎng)不同,這意味著網(wǎng)絡(luò)不同监署。
離開
container4
颤专,并使用CTRL-p CTRL-q
使其保持運行。 -
從
isolated_nw
網(wǎng)絡(luò)斷開container5
钠乏。 附加到container4
并嘗試pingc5
和foo
栖秕。$ docker network disconnect isolated_nw container5 $ docker attach container4 / # ping -w 4 c5 ping: bad address 'c5' / # ping -w 4 foo PING foo (172.26.0.3): 56 data bytes 64 bytes from 172.26.0.3: seq=0 ttl=64 time=0.070 ms 64 bytes from 172.26.0.3: seq=1 ttl=64 time=0.080 ms 64 bytes from 172.26.0.3: seq=2 ttl=64 time=0.080 ms 64 bytes from 172.26.0.3: seq=3 ttl=64 time=0.097 ms --- foo ping statistics --- 4 packets transmitted, 4 packets received, 0% packet loss round-trip min/avg/max = 0.070/0.081/0.097 ms
您不能再從
container5
收到isolated_nw
網(wǎng)絡(luò)上的container5
。 但是缓熟,您仍然可以使用別名foo
到達container4
(從container4
)累魔。離開
container4
摔笤,并使用CTRL-p CTRL-q
使其保持運行。
docker network
限制
雖然docker network
是控制您的容器使用的網(wǎng)絡(luò)的推薦方法垦写,但它確實有一些限制吕世。
環(huán)境變量注入
環(huán)境變量注入是靜態(tài)的,環(huán)境變量在容器啟動后無法更改梯投。 遺留的--link
標(biāo)志將所有環(huán)境變量共享到鏈接的容器命辖,但docker network
命令沒有等效選項。 當(dāng)您使用docker network
將容器連接到網(wǎng)絡(luò)時分蓖,不能在容器之間動態(tài)共享環(huán)境變量尔艇。
使用網(wǎng)絡(luò)范圍的別名
遺留的link提供傳出名稱解析,隔離在配置別名的容器內(nèi)么鹤。 網(wǎng)絡(luò)范圍的別名不允許這種單向隔離终娃,而是為網(wǎng)絡(luò)的所有成員提供別名。
以下示例說明了此限制蒸甜。
-
在網(wǎng)絡(luò)
isolated_nw
創(chuàng)建另一個容器container6
棠耕,并給它網(wǎng)絡(luò)別名app
。$ docker run --network=isolated_nw -itd --name=container6 --network-alias app busybox 8ebe6767c1e0361f27433090060b33200aac054a68476c3be87ef4005eb1df17
-
attach到
container4
柠新。 嘗試通過名稱(container6
)和網(wǎng)絡(luò)別名(app
)ping容器窍荧。 請注意氏淑,IP地址是一樣的鬼贱。$ docker attach container4 / # ping -w 4 app PING app (172.25.0.6): 56 data bytes 64 bytes from 172.25.0.6: seq=0 ttl=64 time=0.070 ms 64 bytes from 172.25.0.6: seq=1 ttl=64 time=0.080 ms 64 bytes from 172.25.0.6: seq=2 ttl=64 time=0.080 ms 64 bytes from 172.25.0.6: seq=3 ttl=64 time=0.097 ms --- app ping statistics --- 4 packets transmitted, 4 packets received, 0% packet loss round-trip min/avg/max = 0.070/0.081/0.097 ms / # ping -w 4 container6 PING container5 (172.25.0.6): 56 data bytes 64 bytes from 172.25.0.6: seq=0 ttl=64 time=0.070 ms 64 bytes from 172.25.0.6: seq=1 ttl=64 time=0.080 ms 64 bytes from 172.25.0.6: seq=2 ttl=64 time=0.080 ms 64 bytes from 172.25.0.6: seq=3 ttl=64 time=0.097 ms --- container6 ping statistics --- 4 packets transmitted, 4 packets received, 0% packet loss round-trip min/avg/max = 0.070/0.081/0.097 ms
從
container4
離開乏苦,并使用CTRL-p CTRL-q
使其保持運行侍郭。 -
將
container6
連接到local_alias
網(wǎng)絡(luò)莹汤,并為其賦予網(wǎng)絡(luò)范圍的別名scoped-app
帝牡。$ docker network connect --alias scoped-app local_alias container6
現(xiàn)在
container6
在網(wǎng)絡(luò)isolated_nw
中的別名為app
婴洼,在網(wǎng)絡(luò)local_alias
中別名為scoped-app
距误。 -
嘗試從
container4
(連接到這兩個網(wǎng)絡(luò))和container5
(僅連接到isolated_nw
)連接到這些別名喇嘱。$ docker attach container4 / # ping -w 4 scoped-app PING foo (172.26.0.5): 56 data bytes 64 bytes from 172.26.0.5: seq=0 ttl=64 time=0.070 ms 64 bytes from 172.26.0.5: seq=1 ttl=64 time=0.080 ms 64 bytes from 172.26.0.5: seq=2 ttl=64 time=0.080 ms 64 bytes from 172.26.0.5: seq=3 ttl=64 time=0.097 ms --- foo ping statistics --- 4 packets transmitted, 4 packets received, 0% packet loss round-trip min/avg/max = 0.070/0.081/0.097 ms
離開
container4
茉贡,并使用CTRL-p CTRL-q
使其保持運行。$ docker attach container5 / # ping -w 4 scoped-app ping: bad address 'scoped-app'
離開
container5
者铜,并使用CTRL-p CTRL-q
使其保持運行腔丧。這表明將別名僅在定義它的網(wǎng)絡(luò)上生效,只有連接到該網(wǎng)絡(luò)的容器才能訪問該別名作烟。
將多個容器解析為一個別名
多個容器可在同一網(wǎng)絡(luò)內(nèi)共享相同的網(wǎng)絡(luò)范圍別名愉粤。 這提供了一種DNS輪詢(round-robbin)高可用性。 當(dāng)使用諸如Nginx這樣的軟件時拿撩,這可能不可靠衣厘,Nginx通過IP地址來緩存客戶端。
以下示例說明了如何設(shè)置和使用網(wǎng)絡(luò)別名。
注意 :使用網(wǎng)絡(luò)別名進行DNS輪詢高可用的用戶應(yīng)考慮使用swarm服務(wù)影暴。 Swarm服務(wù)提供了開箱即用的错邦、類似的負載均衡功能。 如果連接到任何節(jié)點型宙,即使是不參與服務(wù)的節(jié)點撬呢。 Docker將請求發(fā)送到正在參與服務(wù)的隨機節(jié)點,并管理所有的通信妆兑。
-
在
isolated_nw
中啟動container7
魂拦,別名與container6
相同,即app
搁嗓。$ docker run --network=isolated_nw -itd --name=container7 --network-alias app busybox 3138c678c123b8799f4c7cc6a0cecc595acbdfa8bf81f621834103cd4f504554
當(dāng)多個容器共享相同的別名時芯勘,其中一個容器將解析為別名。 如果該容器不可用腺逛,則另一個具有別名的容器將被解析荷愕。 這提供了群集中的高可用性。
注意 :在IP地址解析時屉来,所選擇的容器是不完全可預(yù)測的路翻。 因此,在下面的練習(xí)中茄靠,您可能會在一些步驟中獲得不同的結(jié)果。 如果步驟假定返回的結(jié)果是
container6
但是您收到container7
蝶桶,這就是為什么慨绳。 -
從
container4
開始連續(xù)ping到app
別名。$ docker attach container4 $ ping app PING app (172.25.0.6): 56 data bytes 64 bytes from 172.25.0.6: seq=0 ttl=64 time=0.070 ms 64 bytes from 172.25.0.6: seq=1 ttl=64 time=0.080 ms 64 bytes from 172.25.0.6: seq=2 ttl=64 time=0.080 ms 64 bytes from 172.25.0.6: seq=3 ttl=64 time=0.097 ms ...
返回的IP地址屬于
container6
真竖。 -
在另一個終端脐雪,停止
container6
。$ docker stop container6
在連接到
container4
的終端 恢共,觀察ping
輸出战秋。 當(dāng)container6
關(guān)閉時,它將暫停讨韭,因為ping
命令在首次調(diào)用時查找IP脂信,并且發(fā)現(xiàn)該IP不再可用。 但是透硝,ping
命令在默認情況下具有非常長的超時時間狰闪,因此不會發(fā)生錯誤。 -
使用
CTRL+C
退出ping
命令并再次運行濒生。$ ping app PING app (172.25.0.7): 56 data bytes 64 bytes from 172.25.0.7: seq=0 ttl=64 time=0.095 ms 64 bytes from 172.25.0.7: seq=1 ttl=64 time=0.075 ms 64 bytes from 172.25.0.7: seq=2 ttl=64 time=0.072 ms 64 bytes from 172.25.0.7: seq=3 ttl=64 time=0.101 ms ...
app
別名現(xiàn)在解析為container7
的IP地址埋泵。 -
最后一次測試,重新啟動
container6
。$ docker start container6
在連接到
container4
的終端丽声,再次運行ping
命令礁蔗。 現(xiàn)在可能會再次解決container6
。 如果您幾次啟動和停止ping
雁社,您將看到每個容器的響應(yīng)浴井。$ docker attach container4 $ ping app PING app (172.25.0.6): 56 data bytes 64 bytes from 172.25.0.6: seq=0 ttl=64 time=0.070 ms 64 bytes from 172.25.0.6: seq=1 ttl=64 time=0.080 ms 64 bytes from 172.25.0.6: seq=2 ttl=64 time=0.080 ms 64 bytes from 172.25.0.6: seq=3 ttl=64 time=0.097 ms ...
用
CTRL+C
停止ping。 從container4
離開歧胁,并使用CTRL-p CTRL-q
使其保持運行滋饲。
斷開容器
您可以隨時使用docker network disconnect
命令斷開容器與網(wǎng)絡(luò)的連接。
-
從
isolated_nw
網(wǎng)絡(luò)斷開container2
喊巍,然后檢查container2
和isolated_nw
網(wǎng)絡(luò)屠缭。$ docker network disconnect isolated_nw container2 $ docker inspect --format='' container2 | python -m json.tool { "bridge": { "NetworkID":"7ea29fc1412292a2d7bba362f9253545fecdfa8ce9a6e37dd10ba8bee7129812", "EndpointID": "9e4575f7f61c0f9d69317b7a4b92eefc133347836dd83ef65deffa16b9985dc0", "Gateway": "172.17.0.1", "GlobalIPv6Address": "", "GlobalIPv6PrefixLen": 0, "IPAddress": "172.17.0.3", "IPPrefixLen": 16, "IPv6Gateway": "", "MacAddress": "02:42:ac:11:00:03" } } $ docker network inspect isolated_nw [ { "Name": "isolated_nw", "Id": "06a62f1c73c4e3107c0f555b7a5f163309827bfbbf999840166065a8f35455a8", "Scope": "local", "Driver": "bridge", "IPAM": { "Driver": "default", "Config": [ { "Subnet": "172.21.0.0/16", "Gateway": "172.21.0.1/16" } ] }, "Containers": { "467a7863c3f0277ef8e661b38427737f28099b61fa55622d6c30fb288d88c551": { "Name": "container3", "EndpointID": "dffc7ec2915af58cc827d995e6ebdc897342be0420123277103c40ae35579103", "MacAddress": "02:42:ac:19:03:03", "IPv4Address": "172.25.3.3/16", "IPv6Address": "" } }, "Options": {} } ]
-
當(dāng)容器與網(wǎng)絡(luò)斷開連接時,它不能再與連接到該網(wǎng)絡(luò)的其他容器進行通信崭参,除非它與其他容器具有g(shù)共用他網(wǎng)絡(luò)呵曹。 驗證
container2
不能再到達isolated_nw
上的container3
。$ docker attach container2 / # ifconfig eth0 Link encap:Ethernet HWaddr 02:42:AC:11:00:03 inet addr:172.17.0.3 Bcast:0.0.0.0 Mask:255.255.0.0 inet6 addr: fe80::42:acff:fe11:3/64 Scope:Link UP BROADCAST RUNNING MULTICAST MTU:9001 Metric:1 RX packets:8 errors:0 dropped:0 overruns:0 frame:0 TX packets:8 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 txqueuelen:0 RX bytes:648 (648.0 B) TX bytes:648 (648.0 B) lo Link encap:Local Loopback inet addr:127.0.0.1 Mask:255.0.0.0 inet6 addr: ::1/128 Scope:Host UP LOOPBACK RUNNING MTU:65536 Metric:1 RX packets:0 errors:0 dropped:0 overruns:0 frame:0 TX packets:0 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 txqueuelen:0 RX bytes:0 (0.0 B) TX bytes:0 (0.0 B) / # ping container3 PING container3 (172.25.3.3): 56 data bytes ^C --- container3 ping statistics --- 2 packets transmitted, 0 packets received, 100% packet loss
-
驗證
container2
是否仍具有與默認bridge
完全連接何暮。/ # ping container1 PING container1 (172.17.0.2): 56 data bytes 64 bytes from 172.17.0.2: seq=0 ttl=64 time=0.119 ms 64 bytes from 172.17.0.2: seq=1 ttl=64 time=0.174 ms ^C --- container1 ping statistics --- 2 packets transmitted, 2 packets received, 0% packet loss round-trip min/avg/max = 0.119/0.146/0.174 ms / #
-
移除
container4
奄喂,container5
,container6
和container7
海洼。$ docker stop container4 container5 container6 container7 $ docker rm container4 container5 container6 container7
處理過時的網(wǎng)絡(luò)端點
在某些情況下跨新,例如在多主機網(wǎng)絡(luò)中以非優(yōu)雅的方式重新啟動Docker daemon,Docker daemon將無法清除過時的連接端點坏逢。 如果新的容器連接到具有與過期端點相同的名稱的網(wǎng)絡(luò)域帐,則此類過時的端點可能會導(dǎo)致錯誤:
ERROR: Cannot start container bc0b19c089978f7845633027aa3435624ca3d12dd4f4f764b61eac4c0610f32e: container already connected to network multihost
要清理這些過時的端點,可移除容器并強制將其與網(wǎng)絡(luò)斷開( docker network disconnect -f
)是整。 這樣肖揣,您就可將容器成功連接到網(wǎng)絡(luò)。
$ docker run -d --name redis_db --network multihost redis
ERROR: Cannot start container bc0b19c089978f7845633027aa3435624ca3d12dd4f4f764b61eac4c0610f32e: container already connected to network multihost
$ docker rm -f redis_db
$ docker network disconnect -f multihost redis_db
$ docker run -d --name redis_db --network multihost redis
7d986da974aeea5e9f7aca7e510bdb216d58682faa83a9040c2f2adc0544795a
刪除網(wǎng)絡(luò)
當(dāng)網(wǎng)絡(luò)中的所有容器都已停止或斷開連接時浮入,您可以刪除網(wǎng)絡(luò)龙优。 如果網(wǎng)絡(luò)連接了端點,則會發(fā)生錯誤事秀。
-
斷開
container3
與isolated_nw
連接彤断。$ docker network disconnect isolated_nw container3
-
檢查
isolated_nw
以驗證沒有其他端點連接到它。$ docker network inspect isolated_nw [ { "Name": "isolated_nw", "Id": "06a62f1c73c4e3107c0f555b7a5f163309827bfbbf999840166065a8f35455a8", "Scope": "local", "Driver": "bridge", "IPAM": { "Driver": "default", "Config": [ { "Subnet": "172.21.0.0/16", "Gateway": "172.21.0.1/16" } ] }, "Containers": {}, "Options": {} } ]
-
刪除
isolated_nw
網(wǎng)絡(luò)秽晚。$ docker network rm isolated_nw
-
列出所有網(wǎng)絡(luò)以驗證
isolated_nw
不再存在:$ docker network ls NETWORK ID NAME DRIVER SCOPE 4bb8c9bf4292 bridge bridge local 43575911a2bd host host local 76b7dc932e03 local_alias bridge local b1a086897963 my-network bridge local 3eb020e70bfd none null local 69568e6336d8 simple-network bridge local
相關(guān)信息
本文首發(fā)
https://docs.docker.com/engine/userguide/networking/work-with-networks/