?
本文檔使用 php中文網(wǎng)手冊 發(fā)布
如果您正在按您的方式完成用戶指南,您只需構(gòu)建并運行一個簡單的應(yīng)用程序。你也建立了自己的形象。本節(jié)教您如何將容器聯(lián)網(wǎng)。
Docker通過使用網(wǎng)絡(luò)驅(qū)動程序默認(rèn)情況下,Docker為您提供兩個網(wǎng)絡(luò)驅(qū)動程序,bridge
而overlay
司機。您還可以編寫一個網(wǎng)絡(luò)驅(qū)動程序插件,以便您可以創(chuàng)建自己的驅(qū)動程序,但這是一個高級任務(wù)。
Docker引擎的每個安裝都會自動包含三個默認(rèn)網(wǎng)絡(luò)。你可以列出它們:
$ docker network ls NETWORK ID NAME DRIVER 18a2866682b8 none nullc288470c46f6 host host 7b369448dccb bridge bridge
名為bridge
是一個特殊的網(wǎng)絡(luò)。除非您另有說明,否則Docker總是在此網(wǎng)絡(luò)中啟動您的容器?,F(xiàn)在試試這個:
$ 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ò)中刪除容器。要做到這一點,您可以同時提供網(wǎng)絡(luò)名稱和容器名稱。還可以使用容器ID。但是,在這個例子中,名稱更快。
$ docker network disconnect bridge networktest
當(dāng)您可以將容器從網(wǎng)絡(luò)斷開時,您不能刪除內(nèi)置的bridge
網(wǎng)絡(luò)名bridge
.網(wǎng)絡(luò)是將集裝箱與其他集裝箱或其他網(wǎng)絡(luò)隔離開來的自然方式。因此,當(dāng)您在Docker方面獲得更多經(jīng)驗時,您將希望創(chuàng)建您自己的網(wǎng)絡(luò)。
Docker引擎本機支持橋接網(wǎng)絡(luò)和覆蓋網(wǎng)絡(luò)。橋網(wǎng)絡(luò)僅限于運行Docker引擎的單個主機。覆蓋網(wǎng)絡(luò)可以包括多個主機,是一個更高級的主題。對于本例,您將創(chuàng)建一個橋網(wǎng)絡(luò):
$ docker network create -d bridge my_bridge
大-d
標(biāo)志告訴Docker使用bridge
新網(wǎng)絡(luò)的驅(qū)動程序。你本可以把這面旗子bridge
此標(biāo)志的默認(rèn)值。繼續(xù)列出您機器上的網(wǎng)絡(luò):
$ docker network ls NETWORK ID NAME DRIVER 7b369448dccb bridge bridge 615d565d498c my_bridge bridge 18a2866682b8 none nullc288470c46f6 host host
如果你檢查這個網(wǎng)絡(luò),你會發(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)用程序,請創(chuàng)建一個網(wǎng)絡(luò)。根據(jù)定義,網(wǎng)絡(luò)為容器提供了完全的隔離。您可以在第一次運行容器時將容器添加到網(wǎng)絡(luò)中。
啟動運行PostgreSQL數(shù)據(jù)庫的容器,并將--net=my_bridge
標(biāo)志將其連接到新網(wǎng)絡(luò):
$ docker run -d --net=my_bridge --name db training/postgres
如果你檢查你的my_bridge
你會看到它有一個容器。還可以檢查容器的連接位置:
$ 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ù)并啟動您現(xiàn)在熟悉的web應(yīng)用程序。這次不要指定網(wǎng)絡(luò)。
$ docker run -d --name web training/webapp python app.py
二次
二次
哪個網(wǎng)絡(luò)是你的web
應(yīng)用程序運行在?檢查應(yīng)用程序,您會發(fā)現(xiàn)它在默認(rè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)在,打開一個運行的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
過了一會兒,用CTRL-C
結(jié)束ping
你會發(fā)現(xiàn)ping失敗了。這是因為這兩個容器在不同的網(wǎng)絡(luò)上運行。你能修好的。然后,使用exit
命令關(guān)閉容器。
Docker網(wǎng)絡(luò)允許您將容器附加到任意數(shù)量的網(wǎng)絡(luò)上。您還可以附加一個已經(jīng)在運行的容器。去吧,把你的跑步web
應(yīng)用程序到my_bridge
...
$ docker network connect my_bridge web
二次
二次
打開一個外殼到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)系一個不同的IP地址,該地址位于my_bridge
的地址不同。bridge
網(wǎng)絡(luò)。
現(xiàn)在您已經(jīng)知道了如何對容器進行網(wǎng)絡(luò)連接,請參見如何管理容器中的數(shù)據(jù)...