非常教程

Docker 17参考手册

引擎 | Engine

使用网络命令(引擎) | Work with network commands (Engine)

本文提供了可用于与Docker网络及其中的容器进行交互的网络子命令的示例。这些命令通过Docker Engine CLI可用。这些命令是:

  • docker network create
  • docker network connect
  • docker network ls
  • docker network rm
  • docker network disconnect
  • docker network inspect

虽然不是必需的,但在尝试本节中的示例之前阅读Understanding Docker网络是一个好主意。这些示例使用默认bridge网络,以便您可以立即尝试。要尝试使用overlay网络,请查看“多主机网络入门指南”。

创建网络

Docker Engine bridge在安装Engine时会自动创建一个网络。该网络对应于docker0引擎传统依赖的桥梁。除了这个网络之外,你可以创建你自己的bridge或者overlay网络。

一个bridge网络驻留在运行泊坞窗引擎实例一台主机上。一个overlay网络可以跨越运行自己的引擎的多个主机。如果您docker network create只运行并提供网络名称,则会为您创建桥接网络。

$ docker network create simple-network

69568e6336d8c96bbf57869030919f7c69524f71183b44d80948bd3927c87f6a

$ docker network inspect simple-network
[
    {
        "Name": "simple-network",
        "Id": "69568e6336d8c96bbf57869030919f7c69524f71183b44d80948bd3927c87f6a",
        "Scope": "local",
        "Driver": "bridge",
        "IPAM": {
            "Driver": "default",
            "Config": [
                {
                    "Subnet": "172.22.0.0/16",
                    "Gateway": "172.22.0.1"
                }
            ]
        },
        "Containers": {},
        "Options": {},
        "Labels": {}
    }
]

bridge网络不同,overlay网络在创建之前需要一些预先存在的条件。这些条件是:

  • 访问键值存储。引擎支持Consul,Etcd和ZooKeeper(分布式存储)键值存储。
  • 连接到键值存储的主机集群。
  • daemon群中每个主机上的正确配置的引擎。

dockerd支持overlay网络的选项是:

  • --cluster-store
  • --cluster-store-opt
  • --cluster-advertise

在创建网络时,Engine默认会为网络创建一个不重叠的子网。您可以覆盖此默认值并直接使用--subnet选项指定子网。在bridge网络上,您只能指定一个子网。一个overlay网络支持多个子网。

注意:强烈建议--subnet在创建网络时使用该选项。如果--subnet未指定,则docker守护进程会自动选择并为网络分配一个子网,并且可能会与您的基础架构中未由docker管理的另一个子网重叠。当容器连接到该网络时,这种重叠会导致连接问题或失败。

除了--subnet选项,你也可以指定--gateway--ip-range--aux-address选项。

$ docker network create -d overlay \
  --subnet=192.168.0.0/16 \
  --subnet=192.170.0.0/16 \
  --gateway=192.168.0.100 \
  --gateway=192.170.0.100 \
  --ip-range=192.168.1.0/24 \
  --aux-address="my-router=192.168.1.5" --aux-address="my-switch=192.168.1.6" \
  --aux-address="my-printer=192.170.1.5" --aux-address="my-nas=192.170.1.6" \
  my-multihost-network

确保你的子网不重叠。如果他们这样做,网络创建失败,引擎返回错误。

创建自定义网络时,可以将其他选项传递给驱动程序。bridge驱动程序接受以下选项:

选项

当量

描述

com.docker.network.bridge.name

-

在创建Linux桥时要使用的桥名称

com.docker.network.bridge.enable_ip_masquerade

--ip-伪装

启用IP伪装

com.docker.network.bridge.enable_icc

--icc

启用或禁用容器连接

com.docker.network.bridge.host_binding_ipv4

--ip

绑定容器端口时的默认IP

com.docker.network.driver.mtu

- 是的

设置容器网络MTU

com.docker.network.driver.mtu选项也受overlay驱动程序支持。

以下参数可以传递给docker network create任何网络驱动程序。

属性

当量

描述

- 内部

-

限制对网络的外部访问

--ipv6

--ipv6

启用IPv6网络

以下示例-o在绑定端口时使用绑定到特定IP地址,然后用于docker network inspect检查网络,最后将新容器附加到新网络。

$ docker network create -o "com.docker.network.bridge.host_binding_ipv4"="172.23.0.1" my-network

b1a086897963e6a2e7fc6868962e55e746bee8ad0c97b54a5831054b5f62672a

$ docker network inspect my-network

[
    {
        "Name": "my-network",
        "Id": "b1a086897963e6a2e7fc6868962e55e746bee8ad0c97b54a5831054b5f62672a",
        "Scope": "local",
        "Driver": "bridge",
        "IPAM": {
            "Driver": "default",
            "Options": {},
            "Config": [
                {
                    "Subnet": "172.23.0.0/16",
                    "Gateway": "172.23.0.1"
                }
            ]
        },
        "Containers": {},
        "Options": {
            "com.docker.network.bridge.host_binding_ipv4": "172.23.0.1"
        },
        "Labels": {}
    }
]

$ docker run -d -P --name redis --network my-network redis

bafb0c808c53104b2c90346f284bda33a69beadcab4fc83ab8f2c5a4410cd129

$ docker ps

CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                        NAMES
bafb0c808c53        redis               "/entrypoint.sh redis"   4 seconds ago       Up 3 seconds        172.23.0.1:32770->6379/tcp   redis

连接容器

您可以将现有容器连接到一个或多个网络。一个容器可以连接到使用不同网络驱动程序的网络。连接后,容器可以使用另一个容器的IP地址或名称进行通信。

对于overlay支持多主机连接的网络或自定义插件,连接到相同多主机网络但从不同主机启动的容器也可以以这种方式进行通信。

此示例使用六个容器,并指导您在需要时创建它们。

基本容器网络示例

  1. 首先,创建并运行两个容器,container1并且container2:$ docker run -itd --name = container1 busybox 18c062ef45ac0c026ee48a83afa39d25635ee5f02b58de4abc8f467bcaa28731 $ docker run -itd --name = container2 busybox 498eaaaf328e1018042c04b2de04036fc04719a6e39a097a4f4866043a2c2152
  2. 创建一个独立的bridge网络来测试。$ docker network create -d bridge --subnet 172.25.0.0/16 isolated_nw 06a62f1c73c4e3107c0f555b7a5f163309827bfbbf999840166065a8f35455a8
  3. 连接container2到网络,然后inspect网络验证连接:$ docker network connect isolated_nw container2 $ docker network inspect isolated_nw [{“Name”:“isolated_nw”,“Id”:“06a62f1c73c4e3107c0f555b7a5f163309827bfbbf999840166065a8f35455a8”,“Scope”:“local”,“Driver”:“bridge “,”IPAM“:{”Driver“:”default“,”Config“:{”Subnet“:”172.25.0.0/16“,”Gateway“:”172.25.0.1/16“}},”容器“: {“90e1f3ec71caf82ae776a827e0712a68a110a3f175954e5bd4222fd142ac9428”:{“Name”:““AddressAddress”:“EndpointID”:“11cedac1810e864d6b1589d92da12af66203879ab89f4ccd8c8fdaa9b1c48b1d”,“MacAddress”:“02:42:ac:19:00:02”,“IPv4Address”:“172.25.0.2/16”,“IPv6Address”:“”}}, “选项”:{}}]请注意container2被自动分配一个IP地址。由于您--subnet在创建网络时指定了一个IP地址,因此从该子网中选择了IP地址。作为提醒,container1仅连接到默认bridge网络。
  4. 启动第三个容器,但这次使用该--ip标志为其分配一个IP地址,并isolated_nw使用docker run命令的--network选项将其连接到网络:$ docker run --network = isolated_nw --ip = 172.25.3.3 -itd --name = container3 busybox 467a7863c3f0277ef8e661b38427737f28099b61fa55622d6c30fb288d88c551只要你指定容器中的IP地址是网络的子网的一部分,你可以将它连接到网络时,通过分配一个IPv4或IPv6地址的容器--ip--ip6旗。当您在使用用户定义的网络时以这种方式指定IP地址时,配置将作为容器配置的一部分保留下来,并在容器重新加载时应用。使用非用户定义的网络时保留了分配的IP地址,因为不能保证在Docker守护程序重新启动时容器的子网不会更改,除非您使用用户定义的网络。
  5. 检查使用的网络资源container3。为简洁起见,下面的输出被截断。$搬运工检查--format = '' container3 { “isolated_nw”:{ “IPAMConfig”:{ “IPv4Address”: “172.25.3.3”}, “NETWORKID”: “1196a4c5af43a21ae38ef34515b6af19236a3fc48122cf585e3f3054d509679b”, “的EndpointId”: “dffc7ec2915af58cc827d995e6ebdc897342be0420123277103c40ae35579103”,“网关“:”172.25.0.1“,”IPAddress“:”172.25.3.3“,”IPPrefixLen“:16,”IPv6Gateway“:”“,”GlobalIPv6Address“:”“,”GlobalIPv6PrefixLen“:0,”MacAddress“:”02 :42:AC:19:03:03"container3isolated_nwbridge
  6. 检查使用的网络资源container2。如果你安装了Python,你可以打印输出。$ docker inspect --format =''container2 | 蟒蛇-m json.tool { “桥”:{ “NETWORKID”: “7ea29fc1412292a2d7bba362f9253545fecdfa8ce9a6e37dd10ba8bee7129812”, “的EndpointId”: “0099f9efb5a3727f6a554f176b1e96fca34cae773da68b3b6a26d046c12cb365”, “网关”: “172.17.0.1”, “GlobalIPv6Address”: “”, “GlobalIPv6PrefixLen”:0 IPAddress“:”172.17.0.3“,”IPPrefixLen“:16,”IPv6Gateway“:”“,”MacAddress“:”02:42:ac:11:00:03“},”IPAMConfig“ isolated_nw“:{”NetworkID“:”container2属于两个网络。它bridge在启动时加入默认网络,并isolated_nw在步骤3 中将其连接到该网络。

使用网络命令(引擎)  |  Work with network commands (Engine)

eth0 Link encap:Ethernet HWaddr 02:42:AC:11:00:03

eth1 Link encap:Ethernet HWaddr 02:42:AC:15:00:02

  1. 使用该docker attach命令连接到运行container2并检查其网络堆栈:$ docker attach container2使用该ifconfig命令检查容器的网络堆栈。您应该看到两个以太网接口,一个用于默认bridge网络,另一个用于默认网络isolated_nw网络。$ sudo ifconfig -a eth0 Link encap:Ethernet HWaddr 02:42:AC:11:00:03 inet addr:172.17.0.3 Bcast:0.0.0.0 Mask:255.255.0.0 inet6 addr:fe80 :: 42:acff:fe11: 3/64范围:连接广播运行多播MTU:9001度量标准:1个RX包:8个错误:0个丢弃:0个超限:0个帧:0个TX包:8个错误:0个丢弃:0个超限:0个载波:0个冲突: 0 txqueuelen:0 RX字节:648(648.0 B)TX字节:648(648.0 B)eth1链路封装:以太网HWaddr 02:42:AC:15:00:02 inet addr:172.25.0.2 Bcast:0.0.0.0掩码: 255.255.0.0 inet6 addr:fe80 :: 42:acff:fe19:2/64适用范围:链路UP BROADCAST运行多播MTU:1500度量标准:1 RX包:8个错误:0丢弃:0超限:0帧:0 TX包: 8个错误:0丢弃:0超限:0载波:
  2. Docker嵌入式DNS服务器为连接到给定网络的容器启用名称解析。这意味着任何连接的容器都可以通过其容器名称在同一网络上ping另一个容器。从内部container2,你可以container3通过名字ping通。/#ping -w 4 container3 PING container3(172.25.3.3):56个数据字节来自172.25.3.3的64个字节:seq = 0 ttl = 64时间= 0.070 ms来自172.25.3.3的64字节:seq = 1 ttl = 64 time = 0.080 ms来自172.25.3.3的64字节:seq = 2 ttl = 64时间= 0.080 ms来自172.25.3.3的64字节:seq = 3 ttl = 64时间= 0.097 ms --- container3 ping统计信息---发送了4个数据包,4接收数据包,0%丢包往返最小/平均/最大= 0.070 / 0.081 / 0.097毫秒此功能不适用于默认bridge网络。两者container1container2连接到bridge网络,但是你不能ping container1container2使用的容器名称。/#ping -w 4 container1 ping:错误地址'container1'您仍然可以直接ping IP地址:/#ping -w 4 172.17.0.2 PING 172.17.0.2(172.17.0.2):56数据字节从172.17开始64字节。 0.2:seq = 0 ttl = 64时间= 0.095 ms来自172.17.0.2的64字节:seq = 1 ttl = 64时间= 0.075 ms来自172.17.0.2的64字节:seq = 2 ttl = 64时间= 0.072 ms来自172.17的64字节.0.2:seq = 3 ttl = 64时间= 0.101 ms --- 172.17.0.2 ping统计信息---发送了4个数据包,接收到了4个数据包,0%丢包往返最小/平均/最大= 0.072 / 0.085 / 0.101 ms分离container2并使其保持运行状态CTRL-p CTRL-q
  3. 目前,container2连接到这两个bridgeisolated_nw网络,因此它可以与两个通讯container1container3。但是,container3container1没有任何共同的网络,所以他们无法沟通。要验证这一点,请附加container3并尝试container1通过IP地址进行ping 。$搬运工附上container3 $平172.17.0.2 PING 172.17.0.2(172.17.0.2):56数据字节^ C --- 172.17.0.2 ping统计--- 10包发送,接收分组0,100%的分组丢失断开与container3和让它继续使用CTRL-p CTRL-q

即使容器未运行,您也可以将容器连接到网络。但是,docker network inspect只显示运行容器的信息。

链接容器而不使用用户定义的网络

完成基本容器网络示例中的步骤后,container2可以container3自动解析名称,因为两个容器都连接到isolated_nw网络。但是,连接到默认bridge网络的容器无法解析彼此的容器名称。如果您需要容器能够通过bridge网络相互通信,则需要使用旧式链接功能。这--link是推荐使用的唯一用例。您应该强烈考虑使用用户定义的网络。

使用遗留link标志为默认bridge网络上的通信之间的通信添加以下功能:

  • 将容器名称解析为IP地址的功能
  • 能够使用定义网络别名作为引用链接容器的替代方式 --link=CONTAINER-NAME:ALIAS
  • 安全的容器连接(通过隔离--icc=false
  • 环境变量注入

重申一下,当您使用用户定义的网络时,所有这些功能都是默认提供的,无需其他配置。此外,您还可以动态连接到多个网络并从多个网络分离。

  • 使用DNS的自动名称解析
  • 支持--link为链接容器提供名称别名的选项
  • 自动保护网络中容器的隔离环境
  • 环境变量注入

以下示例简要介绍如何使用--link

  1. 继续上面的例子,创建一个新的容器,container4并将其连接到网络isolated_nw。另外,container5使用该--link标志将其链接到容器(尚不存在!)。$ docker run --network = isolated_nw -itd --name = container4 --link container5:c5 busybox 01b5df970834b77a9eadbaff39051f237957bd35c4c56f11193e0594cfd5117c这有点棘手,因为container5还不存在。当container5创建,container4将能够解决的名字c5container5的IP地址。 注意:使用旧链接创建的容器之间的任何链接本质上都是静态的,并将容器与别名进行硬绑定。它不容忍链接的容器重新启动。新的链接 用户定义网络中的功能支持容器之间的动态链接,并允许在链接容器中重新启动和IP地址更改。

既然你还没有创建容器container5试图ping它会导致错误。附加container4并尝试ping任一container5或者c5

$ docker attach container4 $ ping container5 ping: bad address 'container5' $ ping c5 ping: bad address 'c5'

container4使用中分离并保持运行CTRL-p CTRL-q

  1. 创建另一个名为的容器container5,并将其链接到container4使用别名c4。$ docker run --network = isolated_nw -itd --name = container5 --link container4:c4 busybox 72eccf2208336f31e9e33ba327734125af00d1e1d2657878e2ee8154fbb23c7a现在连接container4并尝试ping c5container5。$ docker attach container4 /#ping -w 4 c5 PING c5(172.25.0.5):56数据字节来自172.25.0.5的64字节:seq = 0 ttl = 64时间= 0.070 ms来自172.25.0.5的64字节:seq = 1 ttl = 64时间= 0.080毫秒来自172.25.0.5的64字节:seq = 2 ttl = 64时间= 0.080毫秒来自172.25.0.5的64字节:seq = 3 ttl = 64时间= 0.097 ms --- c5 ping statistics --- 4发送数据包,接收到4个数据包,0%丢包往返最小/平均/最大= 0.070 / 0.081 / 0.097 ms /#ping -w 4 container5 PING container5(172.25.0.5):56个数据字节64个字节从172.25.0.5 :seq = 0 ttl = 64时间= 0.070 ms来自172.25.0.5的64字节:seq = 1 ttl = 64时间= 0.080 ms来自172.25.0.5的64字节:seq = 2 ttl = 64时间= 0.080 ms来自172.25的64字节。 0.5:seq = 3 ttl = 64时间= 0.097 ms --- container5 ping statistics ---发送4个数据包,接收4个数据包,0%丢包往返最小/平均/最大= 0.070 / 0.081 / 0。container4并让它继续使用CTRL-p CTRL-q
  2. 最后,附加container5并验证您可以ping通container4。$ docker attach container5 /#ping -w 4 c4 PING c4(172.25.0.4):56个数据字节来自172.25.0.4的64个字节:seq = 0 ttl = 64 time = 0.065 ms来自172.25.0.4的64个字节:seq = 1 ttl = 64时间= 0.070毫秒来自172.25.0.4的64字节:seq = 2 ttl = 64时间= 0.067毫秒来自172.25.0.4的64字节:seq = 3 ttl = 64时间= 0.082毫秒--- c4 ping statistics --- 4数据包传输,接收4个数据包,0%丢包往返最小/平均/最大= 0.065 / 0.070 / 0.082 ms /#ping -w 4 container4 PING容器4(172.25.0.4):56数据字节64个字节从172.25.0.4 :seq = 0 ttl = 64时间= 0.065 ms来自172.25.0.4的64字节:seq = 1 ttl = 64时间= 0.070 ms来自172.25.0.4的64字节:seq = 2 ttl = 64时间= 0.067 ms来自172.25的64字节。 0.4:seq = 3 ttl = 64时间= 0.082 ms --- container4 ping statistics ---发送4个数据包,接收4个数据包,0%丢包往返最小/平均/最大= 0.065 / 0.070 / 0。container5并让它继续使用CTRL-p CTRL-q

网络别名范围示例

链接容器时,无论是使用传统link方法还是使用用户定义的网络,您指定的任何别名仅对指定的容器有意义,并且不适用于默认bridge网络上的其他容器。

另外,如果一个容器属于多个网络,则给定的链接别名在给定的网络范围内。因此,容器可以链接到不同网络中的不同别名,并且别名对于不在同一网络中的容器不起作用。

以下示例说明了这些要点。

  1. 创建名为的另一个网络local_alias:$ docker network create -d bridge --subnet 172.26.0.0/24 local_alias 76b7dc932e037589e6553f59f76008e5b76fa069638cd39776b890607f567aaa
  2. 接下来,连接container4container5新的网络local_alias与别名foobar:$搬运工网络连接--link container5:FOO LOCAL_ALIAS container4 $搬运工网络连接--link container4:酒吧LOCAL_ALIAS container5
  3. 附加container4并尝试container4使用别名ping (是的,同一个)foo,然后尝试container5使用别名ping容器c5097 ms两个ping都成功了,但子网不同,这意味着网络不同。从中分离container4并让它继续使用CTRL-p CTRL-q
  4. 断开container5isolated_nw网络的连接。附加container4并尝试ping c5foo。$ docker network disconnect isolated_nw container5 $ docker attach container4 /#ping -w 4 c5 ping:坏地址'c5'/#ping -w 4 foo PING foo(172.26.0.3):56数据字节从172.26.0.3开始的64字节:seq = 0 ttl = 64时间= 0.070 ms来自172.26.0.3的64字节:seq = 1 ttl = 64时间= 0.080 ms来自172.26.0.3的64字节:seq = 2 ttl = 64时间= 0.080 ms来自172.26.0.3的64字节: seq = 3 ttl = 64时间= 0.097 ms --- foo ping统计信息---发送4个数据包,接收4个数据包,0%丢包往返min/avg/max= 0.070/0.081/0.097 ms您不能再延长isolated_nw从网络到达容器container5。但是,您仍然可以使用别名访问container4(从container4foo。从中分离container4并让它继续使用CTRL-p CTRL-q

docker networkd的限制

虽然docker network是控制容器使用网络的推荐方式,但确实存在一些限制。

环境变量注入

环境变量注入本质上是静态的,在启动容器后环境变量不能被改变。遗留--link标志将所有环境变量共享到链接的容器,但该docker network命令没有等效。当使用容器连接到网络时docker network,不能在容器间动态共享环境变量。

使用网络范围的别名

传统链接提供在配置别名的容器内隔离的传出名称解析。网络范围的别名不允许进行此单向隔离,但为网络的所有成员提供别名。

以下示例说明了此限制。

  1. 创建另一个container6在网络中调用的容器isolated_nw并为其提供网络别名app。$ docker run --network = isolated_nw -itd --name = container6 --network-alias app busybox 8ebe6767c1e0361f27433090060b33200aac054a68476c3be87ef4005eb1df17
  2. 附加到container4。尝试通过名称(container6)和网络别名(app)。注意IP地址是一样的。$ docker attach container4/#ping -w 4 app PING app(172.25.0.6):56数据字节从172.25.0.6开始64字节:seq = 0 ttl = 64 time = 0.070 ms从172.25.0.6开始64字节:seq = 1 ttl = 64时间= 0.080毫秒来自172.25.0.6的64字节:seq = 2 ttl = 64时间= 0.080毫秒来自172.25.0.6的64字节:seq =3 ttl = 64时间= 0.097毫秒---应用统计信息--- 4数据包传输,接收4个数据包,0%丢包往返min/avg/max= 0.070/0.081/0.097 ms/#ping -w 4 container6 PING容器5(172.25.0.6):56个数据字节64个字节从172.25.0.6 :seq = 0 ttl = 64时间= 0.070ms来自172.25.0.6的64字节:seq = 1ttl = 64时间= 0.080ms来自172.25.0.6的64字节:seq = 2ttl = 64时间= 0.080ms来自172.25的64字节。 0.6:seq = 3 ttl = 64时间= 0.097 ms --- container6 ping statistics ---发送了4个数据包,接收到了4个数据包,container4并让它继续使用CTRL-p CTRL-q
  3. 使用网络范围的别名连接container6local_alias网络scoped-app。$ docker网络连接--alias scoped-app local_alias container6现在在网络和网络中container6是别名。appisolated_nwscoped-applocal_alias
  4. 尝试从container4(连接到这两个网络)和container5(仅连接到isolated_nw)这些别名中获取。$ docker attach container4/#ping -w 4 scoped-app PING foo(172.26.0.5):56个数据字节来自172.26.0.5的64个字节:seq = 0 ttl = 64时间= 0.070 ms来自172.26.0.5的64个字节:seq = 1 ttl = 64时间= 0.080 ms来自172.26.0.5的64字节:seq =2 ttl = 64时间= 0.080 ms来自172.26.0.5的64字节:seq = 3 ttl = 64时间= 0.097 ms --- foo ping statistics - - 4个数据包传输,4个数据包接收,0%丢包往返最小/平均/最大= 0.070/0.081/0.097毫秒分离container4并保持使用状态CTRL-p CTRL-q。$ docker attach container5/#ping -w 4 scoped-app ping:坏地址'scoped-app'分离container5并保持它正在运行使用CTRL-p CTRL-q

这表明一个别名的作用范围是它定义的网络,只有连接到该网络的容器才能访问该别名。

将多个容器解析为单个别名

多个容器可以在同一个网络中共享相同的网络范围别名。这提供了一种DNS循环高可用性。这在使用Nginx等软件时可能不可靠,该软件通过IP地址缓存客户端。

以下示例说明如何设置和使用网络别名。

注意:那些使用网络别名进行DNS轮询高可用性的应该考虑使用swarm服务。Swarm服务提供了一个类似的负载均衡功能。如果连接到任何节点,即使是没有参与服务的节点。Docker将请求发送给参与服务的随机节点并管理所有通信。

  1. 启动container7isolated_nw用相同的别名container6,这是app。$ docker run --network = isolated_nw -itd --name = container7 --network-alias app busybox 3138c678c123b8799f4c7cc6a0cecc595acbdfa8bf81f621834103cd4f504554当多个容器共享相同的别名时,其中一个容器将解析为别名。如果该容器不可用,则另一个具有别名的容器将被解析。这在集群内提供了一种高可用性。 注意:IP地址解析后,选择解析IP地址的容器不是完全可预测的。因此,在下面的练习中,您可能会在某些步骤中得到不同的结果。如果该步骤假设返回的结果是container6但你得到container7,这就是为什么。
  2. 从开始的连续平container4app别名。$ docker attach container4 $ ping app PING应用程序(172.25.0.6):56个数据字节从172.25.0.6开始64个字节:seq = 0 ttl = 64时间= 0.070 ms从172.25.0.6开始64字节:seq = 1 ttl = 64 time = 0.080 ms来自172.25.0.6的64字节:seq = 2 ttl = 64 time = 0.080 ms从172.25.0.6开始的64字节:seq = 3 ttl = 64 time = 0.097 ms ...返回的IP地址属于container6
  3. 在另一个终端,停下来container6。$ docker stop container6在连接的终端上container4,观察ping输出。它会在container6停机时暂停,因为ping命令会在首次调用时查找IP,并且该IP不再可用。但是,ping默认情况下,该命令的超时时间很长,因此不会发生错误。
  4. 使用退出ping命令CTRL+C并再次运行。$ ping app PING应用程序(172.25.0.7):56个数据字节来自172.25.0.7的64个字节:seq = 0 ttl = 64时间= 0.095 ms来自172.25.0.7的64字节:seq = 1 ttl = 64时间= 0.075 ms 64字节从172.25.0.7开始:seq = 2 ttl = 64 time = 0.072 ms从172.25.0.7开始64字节:seq = 3 ttl = 64 time = 0.101 ms ...现在app别名解析为IP地址container7
  5. 对于最后一个测试,重新启动container6。$ docker start container6在连接的终端中container4ping再次运行该命令。它现在可能会container6再次解决。如果您ping多次启动和停止,您会看到每个容器的响应。$ docker attach container4 $ ping app PING应用程序(172.25.0.6):56个数据字节从172.25.0.6开始64个字节:seq = 0 ttl = 64时间= 0.070 ms从172.25.0.6开始64字节:seq = 1 ttl = 64 time = 0.080 ms来自172.25.0.6的64个字节:seq = 2 ttl = 64 time = 0.080 ms从172.25.0.6开始的64个字节:seq = 3 ttl = 64 time = 0.097 ms ...停止ping CTRL+C。从container4使用中分离并保持运行CTRL-p CTRL-q

断开容器

您可以随时使用docker network disconnect命令将容器与网络断开连接。

  1. 断开container2isolated_nw网络,然后检查container2isolated_nw网络。$ docker network disconnect isolated_nw container2 $ docker inspect --format='' container2 | python -m json.tool { "bridge": { "NetworkID":"7ea29fc1412292a2d7bba362f9253545fecdfa8ce9a6e37dd10ba8bee7129812", "EndpointID": "9e4575f7f61c0f9d69317b7a4b92eefc133347836dd83ef65deffa16b9985dc0", "Gateway": "172.17.0.1", "GlobalIPv6Address": "", "GlobalIPv6PrefixLen": 0, "IPAddress": "172.17.0.3", "IPPrefixLen": 16, "IPv6Gateway": "", "MacAddress": "02:42:ac:11:00:03" } } $ docker network inspect isolated_nw [ { "Name": "isolated_nw", "Id": "06a62f1c73c4e3107c0f555b7a5f163309827bfbbf999840166065a8f35455a8", "Scope": "local", "Driver": "bridge", "IPAM": { "Driver": "default", "Config": { "Subnet": "172.21.0.0/16", "Gateway": "172.21.0.1/16" } }, "Containers": { "467a7863c3f0277ef8e661b38427737f28099b61fa55622d6c30fb288d88c551": { "Name": "container3", "EndpointID": "dffc7ec2915af58cc827d995e6ebdc897342be0420123277103c40ae35579103", "MacAddress": "02:42:ac:19:03:03", "IPv4Address": "172.25.3.3/16", "IPv6Address": "" } }, "Options": {} } ]
  2. 当一个容器与网络断开连接时,它不能再与连接到该网络的其他容器进行通信,除非它具有与它们相同的其他网络。验证container2不能再达到container3,这是在isolated_nw网络。$ docker attach container2 / # ifconfig eth0 Link encap:Ethernet HWaddr 02:42:AC:11:00:03 inet addr:172.17.0.3 Bcast:0.0.0.0 Mask:255.255.0.0 inet6 addr: fe80::42:acff:fe11:3/64 Scope:Link UP BROADCAST RUNNING MULTICAST MTU:9001 Metric:1 RX packets:8 errors:0 dropped:0 overruns:0 frame:0 TX packets:8 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 txqueuelen:0 RX bytes:648 (648.0 B) TX bytes:648 (648.0 B) lo Link encap:Local Loopback inet addr:127.0.0.1 Mask:255.0.0.0 inet6 addr: ::1/128 Scope:Host UP LOOPBACK RUNNING MTU:65536 Metric:1 RX packets:0 errors:0 dropped:0 overruns:0 frame:0 TX packets:0 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 txqueuelen:0 RX bytes:0 (0.0 B) TX bytes:0 (0.0 B) / # ping container3 PING container3 (172.25.3.3): 56 data bytes ^C --- container3 ping statistics --- 2 packets transmitted, 0 packets received, 100% packet loss
  3. 验证是否container2仍然具有与默认bridge网络的完全连接。/ # ping container1 PING container1 (172.17.0.2): 56 data bytes 64 bytes from 172.17.0.2: seq=0 ttl=64 time=0.119 ms 64 bytes from 172.17.0.2: seq=1 ttl=64 time=0.174 ms ^C --- container1 ping statistics --- 2 packets transmitted, 2 packets received, 0% packet loss round-trip min/avg/max = 0.119/0.146/0.174 ms / #
  4. 删除container4container5container6,和container7。$ docker stop container4 container5 container6 container7 $ docker rm container4 container5 container6 container7

处理陈旧的网络端点

在一些情况下,例如不可靠的docker守护进程会在多主机网络中重新启动,守护进程无法清除过时的连接端点。如果新容器与旧网点的名称相同,则此类旧网点可能会导致错误:

ERROR: Cannot start container bc0b19c089978f7845633027aa3435624ca3d12dd4f4f764b61eac4c0610f32e: container already connected to network multihost

要清理这些陈旧的端点,请移除容器并强行断开它与网络的连接(docker network disconnect -f)。现在您可以成功将容器连接到网络。

$ docker run -d --name redis_db --network multihost redis

ERROR: Cannot start container bc0b19c089978f7845633027aa3435624ca3d12dd4f4f764b61eac4c0610f32e: container already connected to network multihost

$ docker rm -f redis_db

$ docker network disconnect -f multihost redis_db

$ docker run -d --name redis_db --network multihost redis

7d986da974aeea5e9f7aca7e510bdb216d58682faa83a9040c2f2adc0544795a

删除网络

当网络中的所有容器都停止或断开连接时,您可以删除网络。如果网络连接了端点,则会发生错误。

  1. 断开container3isolated_nw。$ docker network disconnect isolated_nw container3
  2. 检查isolated_nw以确认没有其他端点连接到它。$ docker network inspect isolated_nw [ { "Name": "isolated_nw", "Id": "06a62f1c73c4e3107c0f555b7a5f163309827bfbbf999840166065a8f35455a8", "Scope": "local", "Driver": "bridge", "IPAM": { "Driver": "default", "Config": { "Subnet": "172.21.0.0/16", "Gateway": "172.21.0.1/16" } }, "Containers": {}, "Options": {} } ]
  3. 删除isolated_nw网络。$ docker network rm isolated_nw
  4. 列出所有网络以验证isolated_nw不再存在:$ docker network ls NETWORK ID NAME DRIVER SCOPE 4bb8c9bf4292 bridge bridge local 43575911a2bd host host local 76b7dc932e03 local_alias bridge local b1a086897963 my-network bridge local 3eb020e70bfd none null local 69568e6336d8 simple-network bridge local

相关信息

  • network create
  • network inspect
  • network connect
  • network disconnect
  • network ls
  • network rm

commands, Usage, network, docker, cluster

引擎 | Engine相关

1..NET核心应用程序(引擎) | .NET Core application (Engine)
2.关于图像,容器和存储驱动程序(引擎) | About images, containers, and storage drivers (Engine)
3.向swarm添加节点(Engine) | Add nodes to the swarm (Engine)
4.应用自定义元数据(引擎) | Apply custom metadata (Engine)
5.应用滚动更新(引擎) | Apply rolling updates (Engine)
6.apt-cacher-ng
7.编写Dockerfiles(引擎)的最佳实践 | Best practices for writing Dockerfiles (Engine)
8.二进制(引擎) | Binaries (Engine)
9.将容器端口绑定到主机(引擎) | Bind container ports to the host (Engine)
10.突破性变化(引擎) | Breaking changes (Engine)
11.建立自己的网桥 | Build your own bridge (Engine)
12.CentOS (Engine)
13.CentOS (Engine)
14.配置容器DNS(引擎) | Configure container DNS (Engine)
15.在用户定义的网络中配置容器DNS(引擎) | Configure container DNS in user-defined networks (Engine)
16.CouchDB (Engine)
17.创建基本映像(引擎) | Create a base image (Engine)
18.创建群(引擎) | Create a swarm (Engine)
19.自定义docker0网桥(引擎) | Customize the docker0 bridge (Engine)
20.Debian (Engine)
21.默认桥接网络 | Default bridge network
22.删除服务(引擎) | Delete the service (Engine)
23.部署服务(引擎) | Deploy a service (Engine)
24.将服务部署到一个群(引擎) | Deploy services to a swarm (Engine)
25.不推荐的引擎功能 | Deprecated Engine features
26.Docker容器网络(引擎) | Docker container networking (Engine)
27.Docker概述(引擎) | Docker overview (Engine)
28.Docker运行参考(引擎) | Docker run reference (Engine)
29.Dockerfile引用(引擎) | Dockerfile reference (Engine)
30.Dockerize应用程序 | Dockerize an application
31.排空节点(引擎) | Drain a node (Engine)
32.引擎 | Engine
33.FAQ(引擎) | FAQ (Engine)
34.Fedora (Engine)
35.开始 | Get started (Engine)
36.开始使用macvlan网络驱动程序 | Get started with macvlan network driver (Engine)
37.开始使用多主机网络 | Get started with multi-host networking (Engine)
38.节点如何工作 | How nodes work (Engine)
39.服务如何运作(引擎) | How services work (Engine)
40.图像管理 | Image management (Engine)
41.检查服务(引擎) | Inspect the service (Engine)
42.安装Docker(引擎) | Install Docker (Engine)
43.IPv6与Docker(引擎) | IPv6 with Docker (Engine)
44.将节点加入群集(引擎) | Join nodes to a swarm (Engine)
45.旧容器链接(引擎) | Legacy container links (Engine)
46.锁定你的群(引擎) | Lock your swarm (Engine)
47.管理群中的节点(引擎) | Manage nodes in a swarm (Engine)
48.使用Docker机密管理敏感数据(引擎) | Manage sensitive data with Docker secrets (Engine)
49.使用PKI管理swarm安全性(引擎) | Manage swarm security with PKI (Engine)
50.管理群体服务网络(引擎) | Manage swarm service networks (Engine)
51.迁移到引擎1.10 | Migrate to Engine 1.10
52.可选的Linux安装后步骤(引擎) | Optional Linux post-installation steps (Engine)
53.总览 | Overview (Engine)
54.总览 | Overview (Engine)
55.PostgreSQL(引擎) | PostgreSQL (Engine)
56.群集模式中的筏共识(引擎) | Raft consensus in swarm mode (Engine)
57.Riak (Engine)
58.以群集模式运行Docker Engine | Run Docker Engine in swarm mode
59.扩展服务(引擎) | Scale the service (Engine)
60.SDKs (Engine)
61.选择一个存储驱动 | Select a storage driver (Engine)
62.设置教程(引擎) | Set up for the tutorial (Engine)
63.SSHd (Engine)
64.存储驱动总览 | Storage driver overview (Engine)
65.存储服务配置数据(引擎) | Store service configuration data (Engine)
66.Swarm管理指南(引擎) | Swarm administration guide (Engine)
67.Swarm模式关键概念(引擎) | Swarm mode key concepts (Engine)
68.Swarm模式覆盖网络安全模型(引擎) | Swarm mode overlay network security model (Engine)
69.群模式概述(引擎) | Swarm mode overview (Engine)
70.Ubuntu (Engine)
71.Ubuntu (Engine)
72.了解容器通信(引擎) | Understand container communication (Engine)
73.使用多阶段构建(引擎) | Use multi-stage builds (Engine)
74.使用swarm模式路由网格(引擎) | Use swarm mode routing mesh (Engine)
75.使用AUFS存储驱动程序(引擎) | Use the AUFS storage driver (Engine)
76.使用Btrfs存储驱动程序(引擎) | Use the Btrfs storage driver (Engine)
77.使用设备映射器存储驱动程序(引擎) | Use the Device mapper storage driver (Engine)
78.使用OverlayFS存储驱动程序(引擎) | Use the OverlayFS storage driver (Engine)
79.使用VFS存储驱动程序(引擎) | Use the VFS storage driver (Engine)
80.使用ZFS存储驱动程序(引擎) | Use the ZFS storage driver (Engine)
81.处理图像 | Work with images
Docker 17

Docker 是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的 Linux 机器上,也可以实现虚拟化。容器是完全使用沙箱机制,相互之间不会有任何接口。

主页 https://docker.com/
源码 https://github.com/docker/docker
版本 17
发布版本 17.06