为什么由docker stack创build的容器有3个ip地址,它们与服务内部检查有所不同

我使用docker stack deploy在2个节点上创build了3个服务

我看着一个服务,首先在容器内

它有3个不同子网的IP地址

ifconfig eth0 Link encap:Ethernet HWaddr 02:42:0a:00:02:05 inet addr:10.0.2.5 Bcast:0.0.0.0 Mask:255.255.255.0 UP BROADCAST RUNNING MULTICAST MTU:1450 Metric:1 RX packets:141427 errors:0 dropped:0 overruns:0 frame:0 TX packets:90456 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 txqueuelen:0 RX bytes:16495496 (15.7 MiB) TX bytes:62287111 (59.4 MiB) eth1 Link encap:Ethernet HWaddr 02:42:ac:13:00:03 inet addr:172.19.0.3 Bcast:0.0.0.0 Mask:255.255.0.0 UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1 RX packets:4 errors:0 dropped:0 overruns:0 frame:0 TX packets:4 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 txqueuelen:0 RX bytes:355 (355.0 B) TX bytes:230 (230.0 B) eth2 Link encap:Ethernet HWaddr 02:42:0a:ff:00:07 inet addr:10.255.0.7 Bcast:0.0.0.0 Mask:255.255.0.0 UP BROADCAST RUNNING MULTICAST MTU:1450 Metric:1 RX packets:253 errors:0 dropped:0 overruns:0 frame:0 TX packets:233 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 txqueuelen:0 RX bytes:16484 (16.0 KiB) TX bytes:17135 (16.7 KiB) lo Link encap:Local Loopback inet addr:127.0.0.1 Mask:255.0.0.0 UP LOOPBACK RUNNING MTU:65536 Metric:1 RX packets:12 errors:0 dropped:0 overruns:0 frame:0 TX packets:12 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 txqueuelen:1 RX bytes:1050 (1.0 KiB) TX bytes:1050 (1.0 KiB) 

但是他们与我从docker服务检查得到的不同

  "VirtualIPs": [ { "NetworkID": "u0n4343zozic7awn0985441pd", "Addr": "10.255.0.6/16" }, { "NetworkID": "mi1l10o7ysnv5jipp8c9wyrvr", "Addr": "10.0.2.4/24" } ] 

所以我的问题是为什么容器有3个IP,他们做什么? 那么VirtualIPs又代表什么呢? 他们用什么?

好吧,我猜你还在你的堆栈里configuration了一个覆盖networking? 那么这将是以下内容:

eth0:是覆盖networking上的容器IP地址 – 这是因为为您的服务创build的泊坞窗networking也将具有CIDR掩码。 你可以通过nslookup来解决你的容器对服务任务:nslookup任务。

eth1:是docker引擎的docker主机的iptables链接的ip地址。

eth2:我的猜测是,这个来自织造networking – 例如,你有没有安装另一个第三方覆盖networking像织? 如果是,删除它,例如运行weave reset

对于虚拟IPS:如果您启动包括覆盖networking的堆栈服务,则您的服务将收到一个虚拟IP地址 – 我想也是为了编织。 阅读更多信息, 请访问https://success.docker.com/Architecture/Docker_Reference_Architecture%3A_Designing_Scalable%2C_Portable_Docker_Container_Networks

从链接的Docker页面:

myserviceparsing为该服务的虚拟IP(VIP),该服务在内部对各个任务IP地址进行负载平衡。 容器名称也可以parsing,尽pipe直接到它们的IP地址。

因此你可以nslookup并将获得虚拟IP。 一般来说,这是一个高级的话题,你将不得不阅读很多。