网络容器 | Network containers (Engine)

网络容器

如果您正在按您的方式完成用户指南,您只需构建并运行一个简单的应用程序。你也建立了自己的形象。本节教您如何将容器联网。

在默认网络上启动容器

Docker通过使用网络驱动程序默认情况下,Docker为您提供两个网络驱动程序bridgeoverlay司机。您还可以编写一个网络驱动程序插件,以便您可以创建自己的驱动程序,但这是一个高级任务。

Docker引擎的每个安装都会自动包含三个默认网络。你可以列出它们:

$ docker network ls NETWORK ID NAME DRIVER 18a2866682b8 none null c288470c46f6 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 null c288470c46f6 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}}' web 172.17.0.2

现在,打开一个运行的shell。db集装箱:

$ docker exec -it db bash root@a205f0dd33b2:/# ping 172.17.0.2 ping 172.17.0.2 PING 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 ms 64 bytes from web (10.0.0.2): icmp_seq=2 ttl=64 time=0.060 ms 64 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网络。

下一步

现在您已经知道了如何对容器进行网络连接,请参见如何管理容器中的数据...

示例用法体积码头文档用户指南数据