Docker 容器网络不通?教你快速排查
先检查宿主机基础网络环境
排查Docker容器网络问题之前,先确保宿主机本身能正常联网。
在终端执行 ping -c 4 8.8.8.8 或 ping -c 4 www.baidu.com,确认网络连通性。
如果宿主机都ping不通外网,那容器自然无法访问外部资源。
接着检查防火墙规则:对于使用iptables的系统,执行 sudo iptables -L -n 查看是否有规则阻断了Docker网桥(默认是docker0)的流量。
对于firewalld,执行 sudo firewall-cmd --list-all 确认docker服务是否被允许。
如果是云服务器,还要检查安全组是否放行了容器需要使用的端口。
三步定位:从容器内部到外部
第一步:检查容器自身网络配置。
进入容器:docker exec -it <容器名或ID> /bin/bash,然后执行 ip addr 或 ifconfig(容器内可能没有ip命令,可用cat /etc/hosts查看主机映射)。
确认容器有IP地址,默认通常为172.17.0.x网段。
再执行 ping 8.8.8.8 测试容器对外访问能力。
第二步:检查容器间通信。
假设有两个容器A和B,在容器A内 ping B的IP地址。
如果不通,检查它们是否在同一个自定义网络里。
Docker默认使用桥接网络,但容器默认只能通过IP互通,通过容器名互通需要自定义网络。
执行 docker network ls 查看已有网络,再用 docker network inspect bridge(或自定义网络名)查看连接了哪些容器。
如果两个容器不在同一个网络,需要将它们加入同一网络:docker network connect mynetwork containerA。
第三步:检查宿主机与容器通信。
在宿主机上 ping 容器IP,如果通但容器内无法访问宿主机IP(如172.17.0.1),可能是iptables规则问题。
执行 sudo iptables -t nat -L -n | grep 172.17.0.0,看是否有MASQUERADE规则。
没有的话,需要重启Docker服务或手动添加规则:sudo iptables -t nat -A POSTROUTING -s 172.17.0.0/16 !。
-o docker0 -j MASQUERADE
高频问题:容器端口映射不生效
很多新手遇到“容器启动了但外部无法访问”的问题。
首先确认启动参数是否包含 -p 宿主机端口:容器端口,例如 -p 8080:80。
然后执行 docker port <容器名> 查看实际映射情况。
接着检查宿主机防火墙是否拦截了该宿主机端口:sudo netstat -tulpn | grep 8080,如果看到docker-proxy在监听,说明映射正常。
若还是不通,尝试关闭防火墙测试:sudo systemctl stop firewalld(临时),如果通了再配置白名单。
避坑说明:别踩这些雷
- 不要直接修改
/etc/docker/daemon.json中的bip参数,除非明确知道后果,改错会导致整个Docker网络不可用。 - 使用自定义网络时记得指定
--subnet和--gateway,否则Docker会自动分配可能导致IP冲突。 - 容器内不要擅自修改
/etc/resolv.conf,Docker的DNS配置通过--dns参数指定,修改后容器重启会还原。 systemctl restart docker会重启所有运行中的容器,非必要不要执行。如果必须重启,先docker-compose down再up更安全。
效果验证:真正打通网络
完成以上排查后,做一次完整验证:从宿主机 curl http://容器IP:端口 得到业务响应;
从另一个容器访问本容器的服务名(需在同一自定义网络);
从外部网络(如手机连Wi-Fi)访问宿主机公网IP+映射端口。
同时观察容器日志:docker logs <容器ID>,如果出现“connection refused”通常是服务未启动或端口错误。
最后,清理测试用的临时容器和网络,保持环境整洁。
如果你正在处理Docker容器网络不通的问题,建议先按本文步骤完整执行,再根据自己的环境做微调;
遇到异常时优先回看避坑和高频问题部分。
掌握这套排查逻辑后,大部分网络故障都能在10分钟内解决。