在 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。但是,这只会偶尔影响某些请求,而不是每个请求。