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

我正在努力执行一个可悲的testing,其中涉及到sandbox01networking中的服务器与在“Docker Host”服务器中运行的Docker容器之间的通信(该计算机与sandbox01networking中的其他节点位于同一个子网中。即在10. *地址/范围内有一个名为ens34的接口,在9 *networking上还有一个eth0接口,允许它访问外部世界:下载软件包,docker图像等等。 )。

无论如何,这里有一个图来说明我有什么: 图解说明网络和Docker容器之间的通信

问题:无法在sandbox01子网(10. *networking)中的节点和容器之间进行通信。 例如,someserver.sandbox01→mydocker2:ens34 :: docker0 :: vethXXX→容器只有当我停止iptables,这使得事情真的很神秘! 只是想知道如果你面临任何类似的问题..任何想法将不胜感激。

谜题:经过多次testing,确认容器不能与10. *networking中的任何其他节点进行通信 – 它的行为不如预期:它应该通过其网关docker0(172.17 .0.1),并通过docker主机中的路由表find与“someserver.sandbox01”(10.1.21.59)进行通信的path。 它只在我们让它在iptables中处理MASQUARADE时才起作用。 但是,Docker会自动添加这个规则: -A POSTROUTING -s 172.17.0.0/16 ! -o docker0 -c 0 0 -j MASQUERADE -A POSTROUTING -s 172.17.0.0/16 ! -o docker0 -c 0 0 -j MASQUERADE

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

容器响应任何通过IP 9的通信。*(eth0) – 即,我可以从我的笔记本电脑发送请求 – 但从来没有通过10. *(ens34)。 如果我在容器中运行一个terminal,容器可以利用所有映射的路由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主机的主要网卡有关吗?

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

 service iptables stop ifconfig ens34:0 10.171.171.171 netmask 255.255.255.0 

而在一些server.sandbox01我们需要添加一个新的路由→

 route add -net 10.171.171.0 netmask 255.255.255.0 gw 10.1.21.18 

那么之间的沟通工作。 我知道..离奇,对吧?

如果你有任何想问的问题,不,我不希望使用“ --net=host ”选项将--net=host的接口复制到我的容器中。

那么,想法? build议? 想法?

Solutions Collecting From Web of "如何使我的Docker容器通过第二个接口与另一个节点通信?"