Docker apt-get 更新失败

新手上路,请多包涵

有人可以帮我在我的 docker 容器中进行 apt-get 工作吗?每当我尝试在我的 docker 容器中运行任何 apt-get 命令时,该命令都会失败。我正在运行 Docker 版本 1.1.1,在 ubuntu 12.04 上构建 bd609d2。

当我做

$ sudo docker run -i -t ubuntu:14.04 /bin/bash
# apt-get update

我得到错误说

无法解析“archive.ubuntu.com”

我尝试在 /etc/default/docker 中取消注释下面的行

DOCKER_OPTS=“–dns 8.8.8.8 –dns 8.8.4.4”

但我仍然无法 ping google.com

ping:未知主机

我确认容器正在使用 dns 服务器 8.8.8.8 和 8.8.4.4

root@0baa87fc6322:/# cat /etc/resolv.conf

名称服务器 8.8.8.8

名称服务器 8.8.4.4

而且我可以 ping 两台服务器,所以我很确定防火墙不只是丢弃我的数据包。

对此的任何帮助将不胜感激!

谢谢!

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

阅读 1.4k
2 个回答

感谢你的帮助!我发现这是一个 dns 问题,而且是因为防火墙。在搜索了更多内容后,我发现了在搜索“docker apt-get fail”时无法找到的这个问题

Docker - 在企业网络上构建映像期间网络调用失败

他的问题与我的类似,解决方案帮助我让它发挥作用。我已经为将来发现这个问题的任何人复制了他的解决方案。

那些 Google 服务器无法从我们的防火墙后面访问,这就是我们无法解析任何 URL 的原因。

解决方法是告诉 Docker 使用哪些 DNS 服务器。此修复取决于您安装 Docker 的方式:Ubuntu Package

如果您安装了 Ubuntu 软件包,请编辑 /etc/default/docker 并添加以下行:

DOCKER_OPTS=“–dns –dns

您可以在此配置中添加任意数量的 DNS 服务器。编辑完此文件后,您将需要重新启动 Docker 服务:

须藤服务码头重新启动

二进制文件

如果您通过二进制方法安装了 Docker(即无软件包),那么您在启动 Docker 守护程序时设置 DNS 服务器:

sudo docker -d -D –dns –dns &

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

如果您看到类似 Could not resolve ... 的错误,则可能是 DNS 配置。

首先要检查的是在 docker 容器 中运行 cat /etc/resolv.conf 。如果它的 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 许可协议

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