具有覆盖网络的 Docker 容器无法跨主机相互通信

具有覆盖网络的 Docker 容器无法跨主机相互通信

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

docker ps
容器 ID 图像 命令 创建状态 端口 名称
77b97d803d8c busybox “sh” 5 天前 已关注 5 天 busybox
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 consul

docker 网络检查 myoverlay
[
    {
        “名称”:“myoverlay”,
        “ID”:“a1752c608259d44a5bc0ad8b47e8b340d0252d026bf113cea681e8a92633e844”,
        “创建时间”:“2017-09-05T06:37:13.271539119Z”,
        “范围”:“全球”,
        “驱动程序”:“覆盖”,
        “启用IPv6”:false,
        “IPAM”:{
            “驱动程序”:“默认”,
            “选项”: {},
            "配置": [
                {
                    "子网":"172.16.16.0/24",
                    "IP范围": "172.16.16.128/25",
                    “辅助地址”:{
                        “ip2”:“172.16.16.2”
                    }
                }
            ]
        },
        “内部”:错误,
        “可附加”:false,
        “入口”:false,
        “配置来源”:{
            “网络”: ””
        },
        “ConfigOnly”:false,
        “容器”:{
            “206af8b467c2020b51017524984b322f1544e6b8594b672d4fa6bcb7b263b564”:{
                “名称”:“web1”,
                “端点ID”:“d44ecac9eb248a90dd895d31170aca65333f248616a0998e22b81e4a1c7414b2”,
                “Mac地址”:“02:42:ac:10:10:81”,
                "IPv4地址": "172.16.16.129/24",
                "IPv6地址": ""
            },
            “77b97d803d8c0c3c3ceb0bcb6ca4f82971f9a68273ec32266cadd950350a4a7e”:{
                “名称”:“busybox”,
                “端点ID”:“1a00a326b49b448c7b280faca58bb7ca67cea5d11c513ce64928b0a76fb673f3”,
                “Mac地址”:“02:42:ac:10:10:82”,
                "IPv4地址": "172.16.16.130/24",
                "IPv6地址": ""
            },
            “ep-f774da45dbf1655150fe5dd0a76b29c02873dd79181f26d1c39f12fd2523897d”:{
                “名称”:“web2”,
                “端点ID”:“f774da45dbf1655150fe5dd0a76b29c02873dd79181f26d1c39f12fd2523897d”,
                “Mac地址”:“02:42:ac:10:10:83”,
                "IPv4地址": "172.16.16.131/24",
                "IPv6地址": ""
            }
        },
        “选项”: {},
        “标签”: {}
    }
]

可以看到,运行 Consul 容器的 Docker 主机上有三个容器在运行。并且同一个 Docker 主机内的容器可以通过 overlay 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 time=0.098 毫秒
来自 172.16.16.129 的 64 字节:seq=1 ttl=64 时间=0.096 毫秒
来自 172.16.16.129 的 64 字节:seq=2 ttl=64 时间=0.096 毫秒
来自 172.16.16.129 的 64 字节:seq=3 ttl=64 时间=0.098 毫秒
^C

以下输出来自已加入覆盖网络的另一台 Docker 主机。

docker 网络检查 myoverlay
[
    {
        “名称”:“myoverlay”,
        “ID”:“a1752c608259d44a5bc0ad8b47e8b340d0252d026bf113cea681e8a92633e844”,
        “创建时间”:“2017-09-05T06:37:13.271539119Z”,
        “范围”:“全球”,
        “驱动程序”:“覆盖”,
        “启用IPv6”:false,
        “IPAM”:{
            “驱动程序”:“默认”,
            “选项”: {},
            "配置": [
                {
                    "子网":"172.16.16.0/24",
                    "IP范围": "172.16.16.128/25",
                    “辅助地址”:{
                        “ip2”:“172.16.16.2”
                    }
                }
            ]
        },
        “内部”:错误,
        “可附加”:false,
        “入口”:false,
        “配置来源”:{
            “网络”: ””
        },
        “ConfigOnly”:false,
        “容器”:{
            “9caaf8d7fe01104f4609053d94ca231fc4c91d5862b90244768c2c08f99cb65e”:{
                “名称”:“web2”,
                “端点ID”:“f774da45dbf1655150fe5dd0a76b29c02873dd79181f26d1c39f12fd2523897d”,
                “Mac地址”:“02:42:ac:10:10:83”,
                "IPv4地址": "172.16.16.131/24",
                "IPv6地址": ""
            },
            “ep-1a00a326b49b448c7b280faca58bb7ca67cea5d11c513ce64928b0a76fb673f3”:{
                “名称”:“busybox”,
                “端点ID”:“1a00a326b49b448c7b280faca58bb7ca67cea5d11c513ce64928b0a76fb673f3”,
                “Mac地址”:“02:42:ac:10:10:82”,
                "IPv4地址": "172.16.16.130/24",
                "IPv6地址": ""
            },
            “ep-d44ecac9eb248a90dd895d31170aca65333f248616a0998e22b81e4a1c7414b2”:{
                “名称”:“web1”,
                “端点ID”:“d44ecac9eb248a90dd895d31170aca65333f248616a0998e22b81e4a1c7414b2”,
                “Mac地址”:“02:42:ac:10:10:81”,
                "IPv4地址": "172.16.16.129/24",
                "IPv6地址": ""
            }
        },
        “选项”: {},
        “标签”: {}
    }
]

一个 Docker 主机上的 docker 容器不知为何无法 ping 通另一个 Docker 主机上的 docker 容器。

docker exec 77b97d803d8c ping 172.16.16.131

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

我尝试通过 telnet 连接到一个 Docker 主机的 Serf 的 7946 端口,但是它没有返回到主机的路由。

我的配置有问题吗?或者缺少覆盖配置?提前感谢任何帮助。

答案1

您看到的行为表明 docker 主机之间某处有防火墙,可能是主机本身的防火墙,也可能是网络上的防火墙。您需要打开以下内容:

  • 7946/两者 (控制)
  • 4789/udp (数据)
  • ipsec 协议 50

用于此的 iptables 命令(如果您的 iptables 默认为删除):

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

我建议在每个节点上使用 tcpdump 来监控此流量是否在某处被阻止。

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

相关内容