You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

同一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,先安装工具再查看规则:
    docker exec -it db1 apk add iptables
    docker exec -it db1 iptables -L
    
    确认没有拒绝ICMP(ping)或PostgreSQL默认端口(5432)的规则。
  • 验证DNS解析有效性:在db1中直接解析db2的域名,排查DNS问题:
    docker exec -it db1 nslookup db2
    
    若解析失败,可尝试重启Docker服务,或检查自定义网络的DNS配置。
  • 跳过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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.24 18:46:06