我正在努力执行一个可悲的测试,该测试涉及 sandbox01 网络中的服务器与在我的“Docker 主机”服务器中运行的 Docker 容器之间的通信(这台机器与 sandbox01 网络中的其他节点位于同一子网中) sandbox01 网络。即,它在 10.* 地址/范围上有一个名为 ens34 的接口(interface)。它在 9.* 网络上还有一个 eth0 接口(interface),允许它访问外部世界:下载包、docker 图像、等等等等)。
问题: 无法在 sandbox01 子网(10.* 网络)中的节点与容器之间进行通信。 例如,someserver.sandbox01 → mydocker2 : ens34::docker0::vethXXX → container 通信只有在我停止 iptables 时才有效,这让事情变得非常神秘!!!只是想知道您是否遇到任何类似的问题..任何想法将不胜感激。
谜底:
经过多次测试,确认容器无法与 10.* 网络中的任何其他节点通信——它的行为不符合预期:它应该通过其网关 docker0 (172.17.0.1) 产生响应,并通过docker主机中的路由表找到与“someserver.sandbox01”(10.1.21.59)通信的方式。
只有当我们让它在 iptables 中处理 MASQUARADE 时它才会起作用。但是,Docker 会自动添加此规则:-A POSTROUTING -s 172.17.0.0/16 ! -o docker0 -c 0 0 -j 化装舞会
**注意那里的“!-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
出于某种原因,这里的这个接口(interface)不能很好地与 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 下添加一个新的子接口(interface) →
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
”选项将接口(interface)从 docker 主机复制到我的容器。
所以,想法?建议?想法?
最佳答案
已解决!!!
在/etc/sysconfig/network-scripts 中,有 2 个文件: route-ens34 和 rule-ens34-
如果您删除它们并重新启动网络,它应该会开始工作。
干杯!
关于linux - 如何让我的 Docker 容器通过第二个接口(interface)与另一个节点通信?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37777132/