如何让我的 Docker 容器通过第二个接口与另一个节点通信?

How do I make my Docker container communicate with another node through a 2nd interface?

我正在努力执行一个可悲的测试,该测试涉及 sandbox01 网络中的服务器与我的 "Docker Host" 服务器中 运行ning 的 Docker 容器之间的通信(这机器与 sandbox01 网络中的其他节点位于同一子网中。即,它在 10.* address/range 上有一个名为 ens34 的接口。它在 9.* 网络上还有一个 eth0 接口,它允许它访问外部世界:下载包、docker 图片等)。

无论如何,这里有一张小图来说明我所拥有的:

问题: 无法在 sandbox01 子网(10.* 网络)中的节点与容器之间进行通信。 例如,someserver.sandbox01 → mydocker2 : ens34 :: docker0 :: vethXXX → container 只有当我停止 iptables 时通信才有效,这让事情变得非常神秘!!!只是想知道您是否遇到任何类似的问题..任何想法将不胜感激。

谜底: 经过多次测试,确认容器无法与 10.* 网络中的任何其他节点通信——它的行为不符合预期:它应该通过其网关产生响应,docker0 (172.17.0.1),并通过 docker 主机中的路由 table 与 "someserver.sandbox01" (10.1.21.59) 通信。 只有当我们让它在 iptables 中处理 MASQUARADE 时它才有效。但是,Docker 会自动添加此规则:-A POSTROUTING -s 172.17.0.0/16 ! -o docker0 -c 0 0 -j MASQUERADE

**注意那里的“!-o docker0”,所以 Docker 不希望我们屏蔽发送请求的 IP 地址???这不知何故搞乱了沟通...

容器对通过 IP 9.* (eth0) 进行的任何通信都响应良好——即,我可以从我的笔记本电脑发送请求——但永远不会通过 10.* (ens34)。如果我 运行 容器内的一个终端,容器可以利用所有映射路由 ping 所有 IP 地址,除了,除了!!! 10.* 范围内的 IP 地址。为什么?????

[root@mydocker2 my-nc-server]#  docker run -it -p 8080:8080 --name nc-server nc-server /bin/sh
sh-4.2# ping 9.83.90.55
PING 9.83.92.20 (9.83.90.55) 56(84) bytes of data.
64 bytes from 9.83.90.55: icmp_seq=1 ttl=117 time=124 ms
64 bytes from 9.83.90.55: icmp_seq=2 ttl=117 time=170 ms
^C
--- 9.83.90.55 ping statistics ---
2 packets transmitted, 2 received, 0% packet loss, time 1000ms
rtt min/avg/max/mdev = 124.422/147.465/170.509/23.046 ms
sh-4.2# ping 9.32.145.98
PING 9.32.148.67 (9.32.145.98) 56(84) bytes of data.
64 bytes from 9.32.145.98: icmp_seq=1 ttl=63 time=1.37 ms
64 bytes from 9.32.145.98: icmp_seq=2 ttl=63 time=0.837 ms
^C
--- 9.32.145.98 ping statistics ---
2 packets transmitted, 2 received, 0% packet loss, time 1001ms
rtt min/avg/max/mdev = 0.837/1.104/1.372/0.269 ms
sh-4.2# ping 10.1.21.5
PING 10.1.21.5 (10.1.21.5) 56(84) bytes of data.
^C
--- 10.1.21.5 ping statistics ---
4 packets transmitted, 0 received, 100% packet loss, time 2999ms
sh-4.2# ping 10.1.21.60
PING 10.1.21.60 (10.1.21.60) 56(84) bytes of data.
^C
--- 10.1.21.60 ping statistics ---
4 packets transmitted, 0 received, 100% packet loss, time 2999ms

出于某种原因,这里的界面与 Docker:

不兼容
ens34: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 10.1.21.18  netmask 255.255.255.0  broadcast 10.1.21.255

这是否与 eth0 是此 Docker 主机的主要 NIC 这一事实有关?

解决方法: 在mydocker2中我们需要停止iptables并在ens34下添加一个新的子接口→

service iptables stop
ifconfig ens34:0 10.171.171.171 netmask 255.255.255.0 

并且在 someserver.sandbox01 中我们需要添加一条新路由 →

route add -net 10.171.171.0 netmask 255.255.255.0 gw 10.1.21.18

然后 then 之间的通信工作。我知道..很奇怪吧?

如果你们有人想问,不,我不想使用“--net=host”选项将接口从 docker 主机复制到我的容器。

所以,想法?建议?想法?

已解决!!!

在 /etc/sysconfig/network-scripts 中,有 2 个文件: route-ens34 和 rule-ens34-

如果您删除它们并重新启动网络,它应该会开始工作。

干杯!