?
Ce document utilise Manuel du site Web PHP chinois Libérer
如果您正在按您的方式完成用戶指南,您只需構(gòu)建并運(yùn)行一個(gè)簡單的應(yīng)用程序。你也建立了自己的形象。本節(jié)教您如何將容器聯(lián)網(wǎng)。
Docker通過使用網(wǎng)絡(luò)驅(qū)動(dòng)程序默認(rèn)情況下,Docker為您提供兩個(gè)網(wǎng)絡(luò)驅(qū)動(dòng)程序,bridge
而overlay
司機(jī)。您還可以編寫一個(gè)網(wǎng)絡(luò)驅(qū)動(dòng)程序插件,以便您可以創(chuàng)建自己的驅(qū)動(dòng)程序,但這是一個(gè)高級(jí)任務(wù)。
Docker引擎的每個(gè)安裝都會(huì)自動(dòng)包含三個(gè)默認(rèn)網(wǎng)絡(luò)。你可以列出它們:
$ docker network ls NETWORK ID NAME DRIVER 18a2866682b8 none nullc288470c46f6 host host 7b369448dccb bridge bridge
名為bridge
是一個(gè)特殊的網(wǎng)絡(luò)。除非您另有說明,否則Docker總是在此網(wǎng)絡(luò)中啟動(dòng)您的容器。現(xiàn)在試試這個(gè):
$ docker run -itd --name=networktest ubuntu 74695c9cea6d9810718fddadc01a727a5dd3ce6a69d09752239736c030599741
二次
二次
檢查網(wǎng)絡(luò)是查找容器IP地址的一種簡單方法。
$ docker network inspect bridge[ { "Name": "bridge", "Id": "f7ab26d71dbd6f557852c7156ae0574bbf62c42f539b50c8ebde0f728a253b6f", "Scope": "local", "Driver": "bridge", "EnableIPv6": false, "IPAM": { "Driver": "default", "Options": null, "Config": [ { "Subnet": "172.17.0.1/16", "Gateway": "172.17.0.1" } ] }, "Internal": false, "Containers": { "3386a527aa08b37ea9232cbcace2d2458d49f44bb05a6b775fba7ddd40d8f92c": { "Name": "networktest", "EndpointID": "647c12443e91faf0fd508b6edfe59c30b642abb60dfab890b4bdccee38750bc1", "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": "9001" }, "Labels": {} }]
您可以通過斷開容器從網(wǎng)絡(luò)中刪除容器。要做到這一點(diǎn),您可以同時(shí)提供網(wǎng)絡(luò)名稱和容器名稱。還可以使用容器ID。但是,在這個(gè)例子中,名稱更快。
$ docker network disconnect bridge networktest
當(dāng)您可以將容器從網(wǎng)絡(luò)斷開時(shí),您不能刪除內(nèi)置的bridge
網(wǎng)絡(luò)名bridge
.網(wǎng)絡(luò)是將集裝箱與其他集裝箱或其他網(wǎng)絡(luò)隔離開來的自然方式。因此,當(dāng)您在Docker方面獲得更多經(jīng)驗(yàn)時(shí),您將希望創(chuàng)建您自己的網(wǎng)絡(luò)。
Docker引擎本機(jī)支持橋接網(wǎng)絡(luò)和覆蓋網(wǎng)絡(luò)。橋網(wǎng)絡(luò)僅限于運(yùn)行Docker引擎的單個(gè)主機(jī)。覆蓋網(wǎng)絡(luò)可以包括多個(gè)主機(jī),是一個(gè)更高級(jí)的主題。對(duì)于本例,您將創(chuàng)建一個(gè)橋網(wǎng)絡(luò):
$ docker network create -d bridge my_bridge
大-d
標(biāo)志告訴Docker使用bridge
新網(wǎng)絡(luò)的驅(qū)動(dòng)程序。你本可以把這面旗子bridge
此標(biāo)志的默認(rèn)值。繼續(xù)列出您機(jī)器上的網(wǎng)絡(luò):
$ docker network ls NETWORK ID NAME DRIVER 7b369448dccb bridge bridge 615d565d498c my_bridge bridge 18a2866682b8 none nullc288470c46f6 host host
如果你檢查這個(gè)網(wǎng)絡(luò),你會(huì)發(fā)現(xiàn)它里面什么都沒有。
$ docker network inspect my_bridge[ { "Name": "my_bridge", "Id": "5a8afc6364bccb199540e133e63adb76a557906dd9ff82b94183fc48c40857ac", "Scope": "local", "Driver": "bridge", "IPAM": { "Driver": "default", "Config": [ { "Subnet": "10.0.0.0/24", "Gateway": "10.0.0.1" } ] }, "Containers": {}, "Options": {}, "Labels": {} }]
要構(gòu)建協(xié)同工作但安全可靠的web應(yīng)用程序,請(qǐng)創(chuàng)建一個(gè)網(wǎng)絡(luò)。根據(jù)定義,網(wǎng)絡(luò)為容器提供了完全的隔離。您可以在第一次運(yùn)行容器時(shí)將容器添加到網(wǎng)絡(luò)中。
啟動(dòng)運(yùn)行PostgreSQL數(shù)據(jù)庫的容器,并將--net=my_bridge
標(biāo)志將其連接到新網(wǎng)絡(luò):
$ docker run -d --net=my_bridge --name db training/postgres
如果你檢查你的my_bridge
你會(huì)看到它有一個(gè)容器。還可以檢查容器的連接位置:
$ docker inspect --format='{{json .NetworkSettings.Networks}}' db{"my_bridge":{"NetworkID":"7d86d31b1478e7cca9ebed7e73aa0fdeec46c5ca29497431d3007d2d9e15ed99","EndpointID":"508b170d56b2ac9e4ef86694b0a76a22dd3df1983404f7321da5649645bf7043","Gateway":"10.0.0.1","IPAddress":"10.0.0.254","IPPrefixLen":24,"IPv6Gateway":"","GlobalIPv6Address":"","GlobalIPv6PrefixLen":0,"MacAddress":"02:42:ac:11:00:02"}}
現(xiàn)在,繼續(xù)并啟動(dòng)您現(xiàn)在熟悉的web應(yīng)用程序。這次不要指定網(wǎng)絡(luò)。
$ docker run -d --name web training/webapp python app.py
二次
二次
哪個(gè)網(wǎng)絡(luò)是你的web
應(yīng)用程序運(yùn)行在?檢查應(yīng)用程序,您會(huì)發(fā)現(xiàn)它在默認(rèn)情況下運(yùn)行bridge
網(wǎng)絡(luò)。
$ docker inspect --format='{{json .NetworkSettings.Networks}}' web{"bridge":{"NetworkID":"7ea29fc1412292a2d7bba362f9253545fecdfa8ce9a6e37dd10ba8bee7129812","EndpointID":"508b170d56b2ac9e4ef86694b0a76a22dd3df1983404f7321da5649645bf7043","Gateway":"172.17.0.1","IPAddress":"10.0.0.2","IPPrefixLen":24,"IPv6Gateway":"","GlobalIPv6Address":"","GlobalIPv6PrefixLen":0,"MacAddress":"02:42:ac:11:00:02"}}
然后,獲取您的ip地址web
$ docker inspect --format='{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' web172.17.0.2
現(xiàn)在,打開一個(gè)運(yùn)行的shell。db
集裝箱:
$ docker exec -it db bash root@a205f0dd33b2:/# ping 172.17.0.2ping 172.17.0.2PING 172.17.0.2 (172.17.0.2) 56(84) bytes of data.^C--- 172.17.0.2 ping statistics ---44 packets transmitted, 0 received, 100% packet loss, time 43185ms
過了一會(huì)兒,用CTRL-C
結(jié)束ping
你會(huì)發(fā)現(xiàn)ping失敗了。這是因?yàn)檫@兩個(gè)容器在不同的網(wǎng)絡(luò)上運(yùn)行。你能修好的。然后,使用exit
命令關(guān)閉容器。
Docker網(wǎng)絡(luò)允許您將容器附加到任意數(shù)量的網(wǎng)絡(luò)上。您還可以附加一個(gè)已經(jīng)在運(yùn)行的容器。去吧,把你的跑步web
應(yīng)用程序到my_bridge
...
$ docker network connect my_bridge web
二次
二次
打開一個(gè)外殼到db
再次應(yīng)用程序并嘗試ping命令。這一次只需使用容器名。web
而不是IP地址。
$ docker exec -it db bash root@a205f0dd33b2:/# ping web PING web (10.0.0.2) 56(84) bytes of data.64 bytes from web (10.0.0.2): icmp_seq=1 ttl=64 time=0.095 ms64 bytes from web (10.0.0.2): icmp_seq=2 ttl=64 time=0.060 ms64 bytes from web (10.0.0.2): icmp_seq=3 ttl=64 time=0.066 ms^C--- web ping statistics ---3 packets transmitted, 3 received, 0% packet loss, time 2000ms rtt min/avg/max/mdev = 0.060/0.073/0.095/0.018 ms
大ping
顯示它正在聯(lián)系一個(gè)不同的IP地址,該地址位于my_bridge
的地址不同。bridge
網(wǎng)絡(luò)。
現(xiàn)在您已經(jīng)知道了如何對(duì)容器進(jìn)行網(wǎng)絡(luò)連接,請(qǐng)參見如何管理容器中的數(shù)據(jù)...