容器网络不通需分层排查:先确认容器有IP且接入有效网络,再依次测试容器→宿主机、→外网、→其他容器连通性,最后检查端口映射、DNS解析、防火墙及iptables规则。
容器网络不通,核心是“连得上”但“通不了”,或干脆“连不上”。排查要分层推进:先确认容器有没有网、能不能通宿主机、能不能通外网、能不能通其他容器,再看端口、dns、防火墙这些关键环节。
确认容器网络基础状态
先看容器是否真的分配了IP、是否处于活跃网络中:
- 运行 docker inspect ,搜索 IPAddress 和 NetworkMode,确认有有效IP(如
172.17.0.2)且不是none或空值 - 用 docker network ls 查看容器所在网络是否存在;如果是自定义网络(如
imes_mes-network),确保该网络已创建且状态为active - 若 IP 显示为
0.0.0.0或字段缺失,说明容器启动时未成功加入网络,可能因网络未就绪或参数错误
分段测试连通性
不要一上来就 curl 外网,按路径逐段验证:
-
容器 → 宿主机:在容器内执行
ping 172.17.0.1(bridge 默认网关);失败则检查宿主机 iptables/firewalld 是否拦截了来自容器子网的流量 -
容器 → 外网:
ping 8.8.8.8测试基础路由;成功但nslookup google.com失败,说明 DNS 有问题,检查/etc/resolv.conf中的 nameserver 是否可用(可临时改成8.8.8.8测试) -
容器 ↔ 容器:同一网络下,用容器名
ping imes-server或直接curl http://imes-server:8080/health;能 ping 通但端口不通,重点查后端服务监听地址(必须是0.0.0.0:8080,而非127.0.0.1:8080)和宿主机DOCKER-USER链规则
检查端口映射与服务监听
宿主机访问不到容器服务,90% 出在这里:
- 启动容器时是否用了 -p 或 --publish?例如
docker run -p 8080:80 nginx;漏掉就无法从宿主机访问 - 运行 docker port 确认端口映射已生效,输出应类似
80/tcp -> 0.0.0.0:8080 - 进入容器,用
netstat -tuln | grep :80或ss -tuln | grep :80确认服务确实在监听对应端口,且绑定地址不是127.0.0.1
定位防火墙与 iptables 干扰
这是最隐蔽也最常被忽略的一环:
- 临时关闭防火墙测试:
sudo ufw disable(Ubuntu)或sudo systemctl stop firewalld(CentOS/RHEL);恢复即通,说明是防火墙问题 - Docker 自身依赖
iptables,但用户自定义规则(尤其在DOCKER-USER链)可能误拦截。执行sudo iptables -L DOCKER-USER -n --line-numbers查看规则 - 若发现限制性规则(如
REJECT或DROP),添加放行规则:sudo iptables -I DOCKER-USER 1 -s 172.23.0.0/16 -p tcp --dport 8080 -j ACCEPT(替换为你的容器子网和端口)











