容器网络不通需分层排查:先验证容器能否访问外网(检查ip转发、iptables nat规则、firewalld冲突),再确认容器间通信(同网络、自定义网络支持服务名解析),最后检查端口监听与暴露(0.0.0.0绑定、docker port映射、防火墙放行)。

容器网络不通不是单一原因导致的,得按层次逐步验证:先看容器能不能出网,再看容器之间通不通,最后确认服务端口和防火墙有没有拦住流量。整个过程不依赖玄学,靠命令和逻辑就能定位。
检查容器是否能访问外网
这是最基础的一环。进容器执行 ping 8.8.8.8 或 curl -I http://httpbin.org:
- 如果直接超时或提示
Network is unreachable,先查宿主机 IP 转发是否开启:cat /proc/sys/net/ipv4/ip_forward,输出应为 1;不是就临时打开:echo 1 > /proc/sys/net/ipv4/ip_forward - 再查 Docker 的 NAT 规则是否存在:
iptables -t nat -L -n | grep MASQUERADE,正常应有类似MASQUERADE all -- 172.17.0.0/16 0.0.0.0/0的条目;没有的话重启 Docker:systemctl restart docker - CentOS/RHEL 上若启用了 firewalld,它常和 Docker 的 iptables 规则冲突,可临时停用测试:
systemctl stop firewalld
验证容器间能否互相通信
默认 bridge 网络下,容器名不能直接解析——这是高频误区:
- 先确认两个容器是否在同一个网络:
docker inspect 容器A | jq '.NetworkSettings.Networks',对比 network name 是否一致 - 若都在默认
bridge,只能用 IP 通信:docker inspect 容器B | jq -r '.NetworkSettings.IPAddress',然后ping这个 IP - 想通过服务名访问,必须使用自定义网络:
docker network create mynet,启动容器时加--network mynet,之后ping 容器名就能通
确认端口监听与暴露是否正确
网络通 ≠ 服务可访问,端口配置错也会“假不通”:
- 进容器检查服务是否监听在
0.0.0.0:端口,而非127.0.0.1:端口(后者只接受本地请求):netstat -tuln | grep :端口 - 查宿主机映射是否生效:
docker port 容器名,看输出是否含预期的0.0.0.0:宿主端口->容器IP:容器端口 - 从宿主机
telnet 容器IP 容器端口或curl http://容器IP:端口,绕过映射直连,判断是网络问题还是端口问题
排查宿主机防火墙与 iptables 干扰
很多“不通”其实是被宿主机策略默默拦截了:
- Ubuntu 用 ufw:
sudo ufw status verbose,重点看是否放行容器网段(如172.17.0.0/16)或目标端口 - CentOS 用 firewalld:
sudo firewall-cmd --list-all --zone=docker(Docker 会自动创建 docker zone,但可能被覆盖) - 通用检查:
sudo iptables -L DOCKER -n和sudo iptables -t nat -L POSTROUTING -n,看是否有 DROP 或缺失 MASQUERADE - 临时关闭防火墙验证是否是它导致的(仅调试用):
sudo ufw disable或sudo systemctl stop firewalld











