©
本文档使用 PHP中文网手册 发布
如果您正在按您的方式完成用户指南,您只需构建并运行一个简单的应用程序。你也建立了自己的形象。本节教您如何将容器联网。
Docker通过使用网络驱动程序默认情况下,Docker为您提供两个网络驱动程序,bridge
而overlay
司机。您还可以编写一个网络驱动程序插件,以便您可以创建自己的驱动程序,但这是一个高级任务。
Docker引擎的每个安装都会自动包含三个默认网络。你可以列出它们:
$ docker network ls NETWORK ID NAME DRIVER 18a2866682b8 none nullc288470c46f6 host host 7b369448dccb bridge bridge
名为bridge
是一个特殊的网络。除非您另有说明,否则Docker总是在此网络中启动您的容器。现在试试这个:
$ docker run -itd --name=networktest ubuntu 74695c9cea6d9810718fddadc01a727a5dd3ce6a69d09752239736c030599741
二次
二次
检查网络是查找容器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": {} }]
您可以通过断开容器从网络中删除容器。要做到这一点,您可以同时提供网络名称和容器名称。还可以使用容器ID。但是,在这个例子中,名称更快。
$ docker network disconnect bridge networktest
当您可以将容器从网络断开时,您不能删除内置的bridge
网络名bridge
.网络是将集装箱与其他集装箱或其他网络隔离开来的自然方式。因此,当您在Docker方面获得更多经验时,您将希望创建您自己的网络。
Docker引擎本机支持桥接网络和覆盖网络。桥网络仅限于运行Docker引擎的单个主机。覆盖网络可以包括多个主机,是一个更高级的主题。对于本例,您将创建一个桥网络:
$ docker network create -d bridge my_bridge
大-d
标志告诉Docker使用bridge
新网络的驱动程序。你本可以把这面旗子bridge
此标志的默认值。继续列出您机器上的网络:
$ docker network ls NETWORK ID NAME DRIVER 7b369448dccb bridge bridge 615d565d498c my_bridge bridge 18a2866682b8 none nullc288470c46f6 host host
如果你检查这个网络,你会发现它里面什么都没有。
$ 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": {} }]
要构建协同工作但安全可靠的web应用程序,请创建一个网络。根据定义,网络为容器提供了完全的隔离。您可以在第一次运行容器时将容器添加到网络中。
启动运行PostgreSQL数据库的容器,并将--net=my_bridge
标志将其连接到新网络:
$ 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"}}
现在,继续并启动您现在熟悉的web应用程序。这次不要指定网络。
$ docker run -d --name web training/webapp python app.py
二次
二次
哪个网络是你的web
应用程序运行在?检查应用程序,您会发现它在默认情况下运行bridge
网络。
$ 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
现在,打开一个运行的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
结束ping
你会发现ping失败了。这是因为这两个容器在不同的网络上运行。你能修好的。然后,使用exit
命令关闭容器。
Docker网络允许您将容器附加到任意数量的网络上。您还可以附加一个已经在运行的容器。去吧,把你的跑步web
应用程序到my_bridge
...
$ docker network connect my_bridge web
二次
二次
打开一个外壳到db
再次应用程序并尝试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
显示它正在联系一个不同的IP地址,该地址位于my_bridge
的地址不同。bridge
网络。
现在您已经知道了如何对容器进行网络连接,请参见如何管理容器中的数据...