我的 docker 容器没有互联网

新手上路,请多包涵

我让它工作正常,但现在它停止了。我尝试了以下命令但无济于事:

docker run -dns 8.8.8.8 base ping google.com

docker run base ping google.com

sysctl -w net.ipv4.ip_forward=1 在主机和容器上

我得到的只是 unknown host google.com 。 Docker 版本 0.7.0

有任何想法吗?

PS ufw 也禁用

原文由 Romeo Mihalcea 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 686
2 个回答

按照以下建议修复:

[…] 您可以尝试重置所有内容吗?

 pkill docker
iptables -t nat -F
ifconfig docker0 down
brctl delbr docker0
docker -d

它将强制 docker 重新创建网桥并重新初始化所有网络规则

https://github.com/dotcloud/docker/issues/866#issuecomment-19218300

似乎界面以某种方式“挂起”。

更新最新版本的 docker:

上面的答案可能仍然可以为您完成工作,但是自从发布此答案以来已经有很长时间了,并且 docker 现在更加完善了,因此请确保在使用 iptables 和全部。

sudo service docker restart 或者(如果你在一个不使用upstart的linux发行版中) sudo systemctl restart docker

原文由 Romeo Mihalcea 发布,翻译遵循 CC BY-SA 4.0 许可协议

首先要检查的是 cat /etc/resolv.conf 在 docker 容器 中运行。如果它的 DNS 服务器无效,例如 nameserver 127.0.x.x ,那么容器将无法将域名解析为 ip 地址,因此 ping google.com 将失败。

要检查的第二件事是在 主机 上运行 cat /etc/resolv.conf 。 Docker基本上每次启动容器时都会将主机的 /etc/resolv.conf 复制到容器中。所以如果主机的 /etc/resolv.conf 是错误的,那么docker容器也是如此。

如果您发现主机的 /etc/resolv.conf 是错误的,那么您有2个选择:

  1. 在 daemon.json 中硬编码 DNS 服务器。如果您希望 DNS 服务器发生变化,这很容易,但并不理想。

  2. 修复主机的 /etc/resolv.conf 。这有点棘手,但它是动态生成的,并且您没有对 DNS 服务器进行硬编码。


1. docker daemon.json 中硬编码 DNS 服务器

  • 编辑 /etc/docker/daemon.json
   {
      "dns": ["10.1.2.3", "8.8.8.8"]
  }

  • 重新启动 docker 守护程序以使这些更改生效:

sudo systemctl restart docker

  • 现在,当您运行/启动容器时,docker 将使用来自 — 的值填充 /etc/resolv.conf daemon.json

2.修复hosts的 /etc/resolv.conf

A. Ubuntu 16.04 及更早版本

  • 对于 Ubuntu 16.04 及更早版本, /etc/resolv.conf 由 NetworkManager 动态生成。

  • 注释掉 dns=dnsmasq 行(带有 # /etc/NetworkManager/NetworkManager.conf

  • 重启 NetworkManager 重新生成 /etc/resolv.conf

sudo systemctl restart network-manager

  • 在主机上验证: cat /etc/resolv.conf

B. Ubuntu 18.04 及更高版本

  • Ubuntu 18.04 改为使用 systemd-resolved 生成 /etc/resolv.conf 。现在默认情况下它使用本地 DNS 缓存 127.0.0.53。这在容器中不起作用,因此 Docker 将默认使用 Google 的 8.8.8.8 DNS 服务器,这可能会破坏防火墙后面的人。

  • /etc/resolv.conf 实际上是一个符号链接( ls -l /etc/resolv.conf ),它在 Ubuntu 中默认指向 /run/systemd/resolve/stub-resolv.conf (127.0.0.53)。

  • 只需将符号链接更改为指向 /run/systemd/resolve/resolv.conf ,其中列出了真实的 DNS 服务器:

sudo ln -sf /run/systemd/resolve/resolv.conf /etc/resolv.conf

  • 在主机上验证: cat /etc/resolv.conf

现在您应该在主机上有一个有效的 /etc/resolv.conf 供 docker 复制到容器中。

原文由 wisbucky 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题