部署 Docker 容器后网络不通,通常是因为宿主机 IPv4 转发未开启、NAT 规则丢失或防火墙拦截了容器网桥流量。建议优先检查宿主机 net.ipv4.ip_forward 状态,确认 iptables MASQUERADE 规则是否存在,并排查 firewalld 或 ufw 是否阻断了 docker0 网桥通信。
先说结论:容器无法访问外网多数源于宿主机网络转发配置或防火墙策略,而非容器内部问题。
- 先确认:宿主机能否 ping 通外网 IP 及域名。
- 先处理:开启 IP 转发并重启 Docker 服务重建 NAT 规则。
- 再验证:容器内 ping 8.8.8.8 与 www.google.com 区分网络层与 DNS 问题。
命令速用版
以下命令用于快速检查关键配置项,需在宿主机 root 权限下执行。
# 检查 IP 转发是否开启\ncat /proc/sys/net/ipv4/ip_forward\n\n# 临时开启 IP 转发\nsysctl -w net.ipv4.ip_forward=1\n\n# 重启 Docker 服务重建网络规则\nsystemctl restart docker\n\n# 检查 NAT 规则是否存在\niptables -t nat -L -n | grep MASQUERADE为什么会这样
Docker 默认使用 bridge 网络模式,容器流量需经宿主机 docker0 网桥转发至外网。
若内核禁用 IP 转发,数据包无法跨越网络命名空间;若 iptables 的 NAT 表缺少 MASQUERADE 规则,容器私有 IP 无法转换为宿主机公网 IP;若防火墙策略默认 DROP 且未放行 Docker 相关链,流量会被直接丢弃。
分步处理
按顺序排查宿主机网络、Docker 服务及防火墙配置。
1. 开启宿主机 IPv4 转发
容器出向流量依赖宿主机内核转发功能。执行 cat /proc/sys/net/ipv4/ip_forward,若输出 0 则需开启。
临时生效:sysctl -w net.ipv4.ip_forward=1
永久生效:写入/etc/sysctl.conf 并执行 sysctl -p。
2. 恢复 Docker NAT 规则
Docker 启动时会自动配置 iptables 规则。若规则丢失,容器无法做源地址转换。
执行 systemctl restart docker 可让 Docker 守护进程重新注册 NAT 规则。检查 iptables -t nat -L -n 应看到针对容器网段的 MASQUERADE 条目。
3. 调整防火墙策略
CentOS 默认 firewalld 可能与 Docker iptables 规则冲突。临时停止 firewalld 测试:systemctl stop firewalld。
若停止后网络恢复,需配置 firewalld 的 docker zone 或改用 iptables 管理规则。Ubuntu 用户检查 ufw 状态,必要时放行 Docker 流量。
4. 配置容器 DNS
若能 ping 通 IP 但无法解析域名,需配置 DNS。编辑/etc/docker/daemon.json,添加"dns": ["8.8.8.8", "114.114.114.114"]。
修改后重启 Docker 服务,新启动的容器将继承该配置。
怎么验证是否生效
进入容器内部执行网络测试,区分连通性与解析问题。
# 测试外网 IP 连通性\ndocker exec -it <容器 ID> ping -c 4 8.8.8.8\n\n# 测试域名解析\ndocker exec -it <容器 ID> ping -c 4 www.google.com\n\n# 查看容器 DNS 配置\ndocker exec -it <容器 ID> cat /etc/resolv.conf若 ping IP 成功但域名失败,确认为 DNS 问题;若两者均失败,确认为 NAT 或路由问题。
常见坑
- 默认 Bridge 网络不支持容器名解析:默认 bridge 模式下容器间无法通过容器名互访,需使用自定义网络或 links。
- firewalld 重启清除规则:重启 firewalld 服务可能会清除 Docker 注入的 iptables 规则,需重启 Docker 恢复。
- IPv6 干扰:部分场景下宿主机 IPv6 配置可能导致路由冲突,可尝试在 sysctl.conf 中禁用 IPv6 测试。
- docker0 网桥损坏:若网络状态异常,可停止 Docker 服务,删除 docker0 网桥后重启服务重建。
常见问题
宿主机能上网但容器不能,是什么原因?
通常是宿主机未开启 IP 转发或 iptables NAT 规则缺失,导致容器流量无法被转发至外网。
容器能 ping 通 IP 但无法访问域名?
这是 DNS 配置问题,需在 Docker daemon.json 中指定公共 DNS 服务器地址。
重启 Docker 后网络规则会恢复吗?
会,Docker 服务启动时会自动重建必要的 iptables NAT 规则和网桥配置。
参考来源
- Docker 容器网络不通排查指南_docker 网络不通-CSDN 博客
- Docker 容器无法访问网络怎么修复_容器内 ping 不通外网如何排查 Docker 网络配置【修复】
- Docker 容器内不能联网的解决方案_腾讯数据架构师的博客-CSDN 博客
- Docker 容器无法访问外网的问题排查与解决指南
- 容器与宿主机网络不通,怎么办?,快速定位并解决 Docker 外部连接故障
- docker 容器无法访问外网,但宿主机却可以访问的解决方案