网络容器 | Network containers (Engine)
网络容器
如果您正在按您的方式完成用户指南,您只需构建并运行一个简单的应用程序。你也建立了自己的形象。本节教您如何将容器联网。
在默认网络上启动容器
Docker通过使用网络驱动程序
默认情况下,Docker为您提供两个网络驱动程序
,bridge
而overlay
司机。您还可以编写一个网络驱动程序
插件,以便您可以创建自己的驱动程序,但这是一个高级任务。
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
网络。
下一步
现在您已经知道了如何对容器进行网络连接,请参见如何管理容器中的数据...