同一Docker网络下两个容器无法通信,求排查解决方案
PostgreSQL容器同网络下无法通信的排查方案
问题描述
我创建了两个PostgreSQL容器并将它们连接到同一Docker网络,但两个容器彼此无法通信。已尝试常规排查步骤但无效,求其他解决方案。
操作命令及执行结果
docker run -d --name db1 -e POSTGRES_PASSWORD=password postgres:10-alpine docker run -d --name db2 -e POSTGRES_PASSWORD=password postgres:10-alpine docker network create myNetwork docker network connect myNetwork db1 docker network connect myNetwork db2 # 确认网络包含两个容器 docker inspect myNetwork docker exec -it db1 ping db2 PING db2 (172.18.0.4): 56 data bytes ^C --- cvat_db ping statistics --- 3 packets transmitted, 0 packets received, 100% packet loss docker exec -it db1 route Kernel IP routing table Destination Gateway Genmask Flags Metric Ref Use Iface default 172.18.0.1 0.0.0.0 UG 0 0 0 eth0 172.18.0.0 * 255.255.0.0 U 0 0 0 eth0 #ifconfig br-3f4022544f42: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500 inet 172.18.0.1 netmask 255.255.0.0 broadcast 172.18.255.255 inet6 fe80::42:e5ff:fe9f:33bc prefixlen 64 scopeid 0x20<link> ether 02:42:e5:9f:33:bc txqueuelen 0 (Ethernet) RX packets 21 bytes 1164 (1.1 KB) RX errors 0 dropped 0 overruns 0 frame 0 TX packets 44 bytes 5656 (5.6 KB) TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0 docker0: flags=4099<UP,BROADCAST,MULTICAST> mtu 1500 inet 172.17.0.1 netmask 255.255.0.0 broadcast 172.17.255.255 inet6 fe80::42:b9ff:fe47:f00c prefixlen 64 scopeid 0x20<link> ether 02:42:b9:47:f0:0c txqueuelen 0 (Ethernet) RX packets 1 bytes 28 (28.0 B) RX errors 0 dropped 0 overruns 0 frame 0 TX packets 54 bytes 6637 (6.6 KB) TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
额外排查及解决方案
- 重新以指定网络启动容器:避免先启动容器再附加网络可能引发的路由冲突,直接在启动时绑定目标网络:
docker stop db1 db2 && docker rm db1 db2 docker run -d --name db1 --network myNetwork -e POSTGRES_PASSWORD=password postgres:10-alpine docker run -d --name db2 --network myNetwork -e POSTGRES_PASSWORD=password postgres:10-alpine - 检查容器内部防火墙规则:Alpine镜像默认无iptables,先安装工具再查看规则:
确认没有拒绝ICMP(ping)或PostgreSQL默认端口(5432)的规则。docker exec -it db1 apk add iptables docker exec -it db1 iptables -L - 验证DNS解析有效性:在db1中直接解析db2的域名,排查DNS问题:
若解析失败,可尝试重启Docker服务,或检查自定义网络的DNS配置。docker exec -it db1 nslookup db2 - 跳过DNS直接用IP通信:用db2的已知IP(172.18.0.4)测试连通性,判断是DNS问题还是网络链路问题:
docker exec -it db1 ping 172.18.0.4 docker exec -it db1 psql -h 172.18.0.4 -U postgres -W - 检查主机防火墙/安全组:确认主机的iptables、ufw等防火墙规则没有阻断Docker网桥(
br-3f4022544f42)的内部流量。 - 查看日志排查错误:检查容器和Docker守护进程的日志,定位网络相关异常:
docker logs db1 docker logs db2 journalctl -u docker.service # 适用于systemd管理的系统
内容的提问来源于stack exchange,提问作者Frank
相关产品推荐
相关产品推荐

