在 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 规则冲突。
临时关闭防火墙测试:sudo ufw disable或sudo 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,若能通说明网络路由正常。
执行ping www.google.com或curl -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 容器无法访问外网,但宿主机却可以访问的解决方案