You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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中添加:
    {
      "iptables": true,
      "ip-masq": true
    }
    
    重启Docker后再次测试。

3. 强制指定DNS服务器

容器DNS解析失败时,直接指定公共DNS服务:

  • 临时测试:docker run --rm --dns 8.8.8.8 alpine ping google.com
  • 永久配置:在/etc/docker/daemon.json中添加:
    {
      "dns": ["8.8.8.8", "8.8.4.4"]
    }
    
    重启Docker后,所有新容器都会使用该DNS配置。

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.19 06:25:18