部署 Docker 容器到海外三网直连 vps 网络不通怎么解决

文章导读
部署 Docker 容器后网络不通,通常是因为宿主机 IPv4 转发未开启、NAT 规则丢失或防火墙拦截了容器网桥流量。建议优先检查宿主机 net.ipv4.ip_forward 状态,确认 iptables MASQUERADE 规则是否存在,并排查 firewalld 或 ufw 是否阻断了 docker0 网桥通信。
📋 目录
  1. A 命令速用版
  2. B 为什么会这样
  3. C 分步处理
  4. D 怎么验证是否生效
  5. E 常见坑
  6. F 常见问题
  7. G 参考来源
A A

部署 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 服务及防火墙配置。

部署 Docker 容器到海外三网直连 vps 网络不通怎么解决

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 条目。

部署 Docker 容器到海外三网直连 vps 网络不通怎么解决

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 服务,新启动的容器将继承该配置。

部署 Docker 容器到海外三网直连 vps 网络不通怎么解决

怎么验证是否生效

进入容器内部执行网络测试,区分连通性与解析问题。

# 测试外网 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 容器无法访问外网,但宿主机却可以访问的解决方案