具有覆盖networking的Docker容器不能相互交叉跨主机通信

在AWS上,我在Docker主机上运行了一个consul容器和一个覆盖networking

 docker工人
容器ID图像命令创build状态端口名称
 77b97d803d8c busybox“sh”5天前忙碌了5天
 206af8b467c2 daocloud.io/library/httpd“httpd-foreground”5天前上载5天0.0.0.0:32768->80/tcp web1
 b40d24fd8f91 progrium / consul“/ bin / start -serve ...”5天前5天53 / tcp,53 / udp,8300-8302 / tcp,8400 / tcp,8301-8302 / udp,0.0.0.0:8500 - > 8500 / tcp领事

dockernetworking检查myoverlay
 [
     {
         “名称”:“myoverlay”,
         “Id”:“a1752c608259d44a5bc0ad8b47e8b340d0252d026bf113cea681e8a92633e844”,
         “Created”:“2017-09-05T06:37:13.271539119Z”,
         “范围”:“全球”,
         “驱动程序”:“覆盖”
         “EnableIPv6”:false,
         “IPAM”:{
             “驱动程序”:“默认”,
             “选项”:{},
             “configuration”:[
                 {
                     “子网”:“172.16.16.0/24”,
                     “IPRange”:“172.16.16.128/25”,
                     “辅助地址”:{
                         “ip2”:“172.16.16.2”
                     }
                 }
             ]
         },
         “内部”:错误,
         “可连接”:假,
         “Ingress”:假,
         “ConfigFrom”:{
             “networking”:“”
         },
         “ConfigOnly”:假,
         “容器”:{
             “206af8b467c2020b51017524984b322f1544e6b8594b672d4fa6bcb7b263b564”:{
                 “名称”:“web1”,
                 “EndpointID”:“d44ecac9eb248a90dd895d31170aca65333f248616a0998e22b81e4a1c7414b2”,
                 “MacAddress”:“02:42:ac:10:10:81”,
                 “IPv4Address”:“172.16.16.129/24”,
                 “IPv6Address”:“”
             },
             “77b97d803d8c0c3c3ceb0bcb6ca4f82971f9a68273ec32266cadd950350a4a7e”:{
                 “名称”:“busybox”,
                 “EndpointID”:“1a00a326b49b448c7b280faca58bb7ca67cea5d11c513ce64928b0a76fb673f3”,
                 “MacAddress”:“02:42:ac:10:10:82”,
                 “IPv4Address”:“172.16.16.130/24”,
                 “IPv6Address”:“”
             },
             “ep-f774da45dbf1655150fe5dd0a76b29c02873dd79181f26d1c39f12fd2523897d”:{
                 “名称”:“web2”,
                 “EndpointID”:“f774da45dbf1655150fe5dd0a76b29c02873dd79181f26d1c39f12fd2523897d”,
                 “MacAddress”:“02:42:ac:10:10:83”,
                 “IPv4Address”:“172.16.16.131/24”,
                 “IPv6Address”:“”
             }
         },
         “选项”:{},
         “标签”: {}
     }
 ]

正如你所看到的,在运行Consul容器的Docker主机上有三个容器正在运行。 而一个Docker主机中的容器可以使用覆盖IP来互相ping通。

 docker exec 77b97d803d8c ping 172.16.16.129
 PING 172.16.16.129(172.16.16.129):56个数据字节
来自172.16.16.129的64个字节:seq = 0 ttl = 64时间= 0.098ms
来自172.16.16.129的64个字节:seq = 1 ttl = 64时间= 0.096ms
来自172.16.16.129的64字节:seq = 2 ttl = 64时间= 0.096ms
来自172.16.16.129的64个字节:seq = 3 ttl = 64时间= 0.098ms
 ^ C

以下输出来自已经join覆盖networking的另一个Docker主机。

 dockernetworking检查myoverlay
 [
     {
         “名称”:“myoverlay”,
         “Id”:“a1752c608259d44a5bc0ad8b47e8b340d0252d026bf113cea681e8a92633e844”,
         “Created”:“2017-09-05T06:37:13.271539119Z”,
         “范围”:“全球”,
         “驱动程序”:“覆盖”
         “EnableIPv6”:false,
         “IPAM”:{
             “驱动程序”:“默认”,
             “选项”:{},
             “configuration”:[
                 {
                     “子网”:“172.16.16.0/24”,
                     “IPRange”:“172.16.16.128/25”,
                     “辅助地址”:{
                         “ip2”:“172.16.16.2”
                     }
                 }
             ]
         },
         “内部”:错误,
         “可连接”:假,
         “Ingress”:假,
         “ConfigFrom”:{
             “networking”:“”
         },
         “ConfigOnly”:假,
         “容器”:{
             “9caaf8d7fe01104f4609053d94ca231fc4c91d5862b90244768c2c08f99cb65e”:{
                 “名称”:“web2”,
                 “EndpointID”:“f774da45dbf1655150fe5dd0a76b29c02873dd79181f26d1c39f12fd2523897d”,
                 “MacAddress”:“02:42:ac:10:10:83”,
                 “IPv4Address”:“172.16.16.131/24”,
                 “IPv6Address”:“”
             },
             “ep-1a00a326b49b448c7b280faca58bb7ca67cea5d11c513ce64928b0a76fb673f3”:{
                 “名称”:“busybox”,
                 “EndpointID”:“1a00a326b49b448c7b280faca58bb7ca67cea5d11c513ce64928b0a76fb673f3”,
                 “MacAddress”:“02:42:ac:10:10:82”,
                 “IPv4Address”:“172.16.16.130/24”,
                 “IPv6Address”:“”
             },
             “ep-d44ecac9eb248a90dd895d31170aca65333f248616a0998e22b81e4a1c7414b2”:{
                 “名称”:“web1”,
                 “EndpointID”:“d44ecac9eb248a90dd895d31170aca65333f248616a0998e22b81e4a1c7414b2”,
                 “MacAddress”:“02:42:ac:10:10:81”,
                 “IPv4Address”:“172.16.16.129/24”,
                 “IPv6Address”:“”
             }
         },
         “选项”:{},
         “标签”: {}
     }
 ]

来自一个Docker主机的docker集装箱无法ping通另一个Docker主机。

 docker exec 77b97d803d8c ping 172.16.16.131

Docker主机的安全组已允许彼此的所有stream量。

我试图telnet一个Docker主机的Serf的7946端口,但是它只返回没有到主机的路由。

我的configuration有什么问题吗? 还是缺lessconfiguration的覆盖? 在此先感谢您的帮助。

您所看到的行为表明Docker主机之间存在防火墙,也可能是主机本身的防火墙或networking中的防火墙。 您需要打开以下内容:

  • 7946 /双方(控制)
  • 4789 / udp(数据)
  • ipsec的协议50

这个iptables命令(如果你有iptables默认丢弃):

iptables -A INPUT -p tcp -m tcp --dport 7946 -j ACCEPT iptables -A INPUT -p tcp -m udp --dport 7946 -j ACCEPT iptables -A INPUT -p tcp -m tcp --dport 4789 -j ACCEPT iptables -A INPUT -p 50 -j ACCEPT 

我build议在每个节点上使用tcpdump来监视这个stream量是否被阻塞在某个地方。

另一种可能性是你遇到了Docker的缺陷,像问题32195 。 但是,这只会偶尔影响一些请求,而不是每个请求。