在 Hetzner Ubuntu 20.04 上部署 Docker 容器网络不通怎么办

文章导读
在 Hetzner Ubuntu 20.04 上 Docker 容器网络不通,通常是因为宿主机 IP 转发未开启、防火墙拦截了 NAT 流量或 DNS 配置缺失。
📋 目录
  1. A 命令速用版
  2. B 为什么会这样
  3. C 分步处理
  4. D 怎么验证是否生效
  5. E 常见坑
  6. F 常见问题
  7. G 参考来源
A A

在 Hetzner Ubuntu 20.04 上 Docker 容器网络不通,通常是因为宿主机 IP 转发未开启、防火墙拦截了 NAT 流量或 DNS 配置缺失。

先说结论:优先检查宿主机 IP 转发状态和防火墙规则,大部分网络不通问题源于这两项配置拦截了容器流量。

  • 先确认:检查/proc/sys/net/ipv4/ip_forward 是否为 1
  • 先处理:临时关闭 ufw 或 firewalld 测试连通性
  • 再验证:在容器内 ping 外网 IP 确认路由正常

命令速用版

# 检查 IP 转发
cat /proc/sys/net/ipv4/ip_forward
# 临时开启 IP 转发
echo 1 > /proc/sys/net/ipv4/ip_forward
# 重启 Docker 服务
sudo systemctl restart docker
# 查看容器网络模式
docker inspect <container_id> | grep -i "networkmode"
# 测试容器 DNS
docker exec -it <container_id> ping 8.8.8.8

为什么会这样

Docker 默认使用 bridge 模式,容器通过虚拟网桥与宿主机通信,需要宿主机开启 IP 转发才能访问外网。

Ubuntu 20.04 默认可能未开启 IP 转发,且防火墙(ufw 或 iptables)可能阻止了 Docker 的 NAT 规则,导致数据包无法路由。

分步处理

步骤 1:检查宿主机 IP 转发

执行cat /proc/sys/net/ipv4/ip_forward,如果返回 0,说明 IP 转发未开启,容器包无法出去。

执行echo 1 > /proc/sys/net/ipv4/ip_forward开启转发,永久生效需写入 sysctl.conf。

步骤 2:检查防火墙规则

Ubuntu 20.04 常用 ufw,CentOS 常用 firewalld,两者都可能与 Docker 的 iptables 规则冲突。

在 Hetzner Ubuntu 20.04 上部署 Docker 容器网络不通怎么办

临时关闭防火墙测试:sudo ufw disablesudo systemctl stop firewalld

如果关闭后网络恢复,需在防火墙中放行 Docker 子网流量或配置 docker zone。

步骤 3:检查 DNS 配置

容器能 ping 通 IP 但无法解析域名,通常是 DNS 问题。

/etc/docker/daemon.json中配置 DNS,例如{"dns":["8.8.8.8","8.8.4.4"]},然后重启 Docker 服务。

步骤 4:重建 Docker 网络

如果默认网桥 docker0 异常,可停止 Docker 服务,清除 iptables NAT 规则,删除 docker0 网桥后重启服务。

怎么验证是否生效

进入容器执行ping 8.8.8.8,若能通说明网络路由正常。

在 Hetzner Ubuntu 20.04 上部署 Docker 容器网络不通怎么办

执行ping www.google.comcurl -I https://www.example.com,若能解析并响应说明 DNS 正常。

在宿主机执行iptables -t nat -L -n | grep MASQUERADE,确认存在 Docker 的 NAT 规则。

常见坑

默认 bridge 网络不支持通过容器名访问,需使用自定义网络或 IP 地址。

IPv6 设置有时会导致容器网络问题,可尝试在/etc/sysctl.conf中禁用 IPv6。

firewalld 重启后会清除 Docker 的 iptables 规则,需重启 Docker 服务恢复。

常见问题

容器能 ping 通 IP 但无法上网?

通常是 DNS 配置问题,检查容器内/etc/resolv.conf或 Docker daemon.json 的 DNS 设置。

宿主机能上网但容器不能?

检查宿主机 IP 转发是否开启,以及防火墙是否拦截了 Docker 的 NAT 流量。

容器间无法通信怎么办?

确认容器是否在同一自定义网络,默认 bridge 网络不支持容器名解析。

参考来源

  • Docker 容器网络不通排查指南_docker 网络不通-CSDN 博客
  • 容器与宿主机网络不通,怎么办?,快速定位并解决 Docker 外部连接故障
  • ubuntu20.04 版本 docker 下载,安装,以及连接超时,网络不可达解决办法
  • ubuntu docker 容器无法连接网络
  • docker 容器无法访问外网,但宿主机却可以访问的解决方案