Strato VPS上Docker容器无网络访问及DNS解析问题求助
问题排查与解决方案
针对你在Strato VC4-8 VPS上遇到的Docker容器联网问题,结合你给出的差异点和测试结果,以下是针对性的排查步骤和解决办法:
1. 统一Cgroup命名空间模式
你已经发现Strato容器的CgroupnsMode为private,而Hetzner为host,这大概率是核心差异点之一。修改Docker默认配置对齐host模式:
- 创建或编辑Docker daemon配置文件:
sudo nano /etc/docker/daemon.json - 写入以下配置:
{ "cgroupns-mode": "host" }
- 重启Docker服务生效:
sudo systemctl restart docker - 测试容器联网:
docker run --rm alpine ping 8.8.8.8
private模式下容器的Cgroup命名空间完全独立,可能和Strato VPS的底层网络管控机制冲突,切换为host模式后可消除该变量。
2. 修复Docker iptables规则
Strato VPS可能默认修改了iptables策略,导致Docker的NAT转发规则未生效:
- 检查Docker的NAT链是否存在:
sudo iptables -t nat -L DOCKER - 如果未找到DOCKER链,重启Docker让它重新生成规则:
sudo systemctl restart docker - 若Ubuntu 22.04默认使用nftables导致兼容问题,强制Docker使用iptables:
在/etc/docker/daemon.json中添加:
重启Docker后再次测试。{ "iptables": true, "ip-masq": true }
3. 强制指定DNS服务器
容器DNS解析失败时,直接指定公共DNS服务:
- 临时测试:
docker run --rm --dns 8.8.8.8 alpine ping google.com - 永久配置:在
/etc/docker/daemon.json中添加:
重启Docker后,所有新容器都会使用该DNS配置。{ "dns": ["8.8.8.8", "8.8.4.4"] }
4. 检查主机网络转发设置
确认主机开启了IP转发,否则容器无法通过主机路由访问外网:
- 查看当前状态:
sysctl net.ipv4.ip_forward - 若返回
net.ipv4.ip_forward = 0,临时开启:sudo sysctl -w net.ipv4.ip_forward=1 - 永久生效:编辑
/etc/sysctl.conf,设置net.ipv4.ip_forward=1,然后执行sudo sysctl -p
5. 容器间通信的替代方案
如果--network host无法满足容器间通信需求,使用Docker自定义bridge网络:
- 创建专属网络:
docker network create app-network - 启动Postgres容器时指定该网络:
docker run -d --name postgres --network app-network postgres:latest - 启动Django容器时加入同一网络:
docker run -d --name django --network app-network your-django-image - 在Django的数据库配置中,将主机名设为
postgres(容器名),自定义bridge网络自带容器名DNS解析,无需依赖host网络。
内容的提问来源于stack exchange,提问作者Brian
相关产品推荐
相关产品推荐

