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

时间:2016-06-12 17:32:01

标签: linux networking docker iptables

我正在努力进行一项可怜的测试,该测试涉及sandbox01网络中的服务器与我的" Docker Host"中运行的Docker容器之间的通信。 server(这台机器与sandbox01网络中的其他节点位于同一个子网中。即,它在10. *地址/范围内有一个名为ens34的接口。它在9. *网络上也有一个eth0接口,它允许它访问外部世界:下载包,码头图像等。)。

无论如何,这里有一个小图来说明我的所作所为: Diagram illustrating communication between networks and the Docker container

问题: 无法在sandbox01子网(10. * network)中的节点与容器之间进行通信。 例如,someserver.sandbox01→mydocker2:ens34 :: docker0 :: vethXXX→容器 沟通只有在我停止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 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

然后之间的沟通起作用。我知道......很奇怪,对吧?

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

那么,想法?建议?想法?

1 个答案:

答案 0 :(得分:1)

解决!!!

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

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

干杯!