VPS 安装 Docker 后容器无法访问外网怎么修

文章导读
Docker 容器无法访问外网通常是因为宿主机的 iptables 规则被防火墙覆盖或 Docker 服务未正确启动 NAT 转发。最推荐先检查 Docker 服务状态和宿主机的防火墙配置。
📋 目录
  1. 命令速用版
  2. 为什么会这样
  3. 分步处理
  4. 怎么验证是否生效
  5. 常见坑
  6. 常见问题
  7. 参考来源
A A

Docker 容器无法访问外网通常是因为宿主机的 iptables 规则被防火墙覆盖或 Docker 服务未正确启动 NAT 转发。最推荐先检查 Docker 服务状态和宿主机的防火墙配置。

先说结论:问题多出在宿主机防火墙拦截了 Docker 的 NAT 转发规则。

  • 先确认 Docker 服务是否运行
  • 先处理 iptables 或 firewalld 配置
  • 再验证容器 DNS 解析

命令速用版

systemctl restart docker
iptables -t nat -L POSTROUTING
docker run `--rm` busybox ping -c 4 8.8.8.8

为什么会这样

Docker 依赖 iptables 实现容器网络地址转换(NAT),宿主机防火墙重启或配置变更会清除 Docker 创建的规则。

默认情况下 Docker 守护进程启动时会自动配置 iptables 规则以允许容器通信和出站访问。如果宿主机安装了 firewalld 或 ufw 并在 Docker 之后启动,或者手动刷新了 iptables,Docker 的 NAT 规则就会丢失,导致容器包无法被正确转发到外网。

分步处理

步骤 1:检查 Docker 服务状态

执行命令systemctl status docker,确保服务处于 active (running) 状态。如果服务未运行,容器网络接口不会创建。

步骤 2:重置 Docker 网络规则

执行命令systemctl restart docker。重启 Docker 服务会强制重新初始化 iptables 链,恢复 NAT 转发规则。

步骤 3:配置防火墙放行

如果使用 firewalld,执行firewall-cmd `--permanent` `--add-masquerade`后重载。如果使用 ufw,需在/etc/ufw/before.rules中允许 Docker 相关规则,避免 ufw 默认策略丢弃转发包。

怎么验证是否生效

运行临时容器测试连通性。执行命令docker run `--rm` busybox ping -c 4 8.8.8.8,看到 reply 字样表示网络层通畅。再执行docker run `--rm` busybox nslookup google.com,确认 DNS 解析正常。

常见坑

  • 直接关闭防火墙可能导致安全风险,建议配置规则而非完全停用。
  • CentOS 7/8 默认使用 firewalld,Ubuntu 默认使用 ufw,两者配置命令不同。
  • 容器能 ping 通 IP 但无法域名访问,通常是容器内 DNS 配置问题而非网络不通。

常见问题

容器能 ping 通 IP 但无法 curl 域名怎么办

这是 DNS 解析问题,检查容器内/etc/resolv.conf配置。

重启 Docker 后规则又失效了怎么办

说明防火墙服务在 Docker 之后启动,调整服务启动顺序或配置防火墙持久化规则。

IPv6 容器无法上网是同样原因吗

IPv6 需要额外开启 ip6tables 支持,配置逻辑类似但需检查daemon.json中的 IPv6 设置。

参考来源

  • Docker 官方文档 - Networking overview (https://docs.docker.com/network/)
  • Linux 防火墙管理工具官方手册