最靠谱的容器互访方案是让它们处于同一自定义网络并用容器名访问;默认bridge网络不支持dns解析,ip易变且不可靠;需确保ip转发开启、iptables规则完整、防火墙不干扰,并分层验证连通性。
镜像和容器是 docker 的两个基础概念,但它们本身不直接解决网络互通问题——网络互通靠的是网络配置、驱动和宿主机内核能力。镜像只是静态模板,容器是运行实例;真正决定“能不能通”的,是容器启动时用的网络模式、所连的网络、以及底层转发是否就绪。
确认容器是否在同一个自定义网络里
默认的 bridge 网络不支持容器名解析,也不推荐用于多容器协作。如果希望容器 A 能直接用 ping mysql 访问容器 B,必须让它们接入同一个 自定义 bridge 网络:
- 创建网络:
docker network create mynet - 启动容器时指定:
docker run --network mynet --name mysql -d mysql:8.0和docker run --network mynet --name app -d myapp - 这样 app 容器内就能直接
ping mysql或curl http://mysql:3306,Docker 自动提供 DNS 解析
检查 IP 转发是否开启(关键底层条件)
即使网络配置正确,若宿主机内核禁止 IP 转发,容器发出的包也出不去。这是最常被忽略却影响最大的一步:
- 临时启用:
echo 1 | sudo tee /proc/sys/net/ipv4/ip_forward - 永久生效:在
/etc/sysctl.conf中添加net.ipv4.ip_forward=1,再执行sudo sysctl -p - 验证:
cat /proc/sys/net/ipv4/ip_forward返回1才算成功
排查 NAT 规则与防火墙干扰
Docker 依赖 iptables 的 MASQUERADE 规则做源地址转换。若规则丢失或被覆盖,容器可收不可发:
- 检查 NAT 表:
iptables -t nat -L -n | grep MASQUERADE,应看到类似MASQUERADE all -- 172.17.0.0/16 0.0.0.0/0 - 若缺失,重启 Docker:
sudo systemctl restart docker,它会自动重建规则 - CentOS/RHEL 用户特别注意:
firewalld默认会清空 Docker 添加的 iptables 规则,建议停用:sudo systemctl stop firewalld,或配置dockerzone
验证容器间连通性的基本路径
别只信 ping,要分层验证:
- 先确认同网段:
docker inspect 容器A | grep IPAddress和docker inspect 容器B | grep IPAddress,看是否都在同一子网(如172.28.0.x) - 再测基础连通:
docker exec 容器A ping -c 3 容器B的IP - 最后测服务端口:
docker exec 容器A telnet 容器B的IP 端口或curl -v http://容器B的IP:端口 - 如果 IP 能通但服务不通,问题大概率在容器内应用监听地址(比如只绑
127.0.0.1,应改用0.0.0.0)











