Docker apt-get更新失败

问题描述 投票:27回答:6

有人可以帮助我在我的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

nameserver 8.8.8.8

nameserver 8.8.4.4

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

任何帮助都将不胜感激!

谢谢!

dns ubuntu-12.04 docker
6个回答
26
投票

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

Docker - Network calls fail during image build on corporate network

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

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

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

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

DOCKER_OPTS =“ - dns <your_dns_server_1> --dns <your_dns_server_2>”

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

sudo服务码头重启

二进制

如果你已经通过二进制方法安装了Docker(即没有包),那么在启动Docker守护进程时设置DNS服务器:

sudo docker -d -D --dns --dns&


9
投票

如果您看到像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错误,那么您有两个选择:

  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.修复主机的/etc/resolv.conf

A. Ubuntu 16.04及更早版本

  • 对于Ubuntu 16.04及更早版本,/etc/resolv.conf由NetworkManager动态生成。
  • 在qazxsw poi中评论出qazxsw poi(带有qazxsw poi)这一行
  • 重新启动NetworkManager以重新生成dns=dnsmasq#
  • 在主机上验证:/etc/NetworkManager/NetworkManager.conf

B. Ubuntu 18.04及更高版本

  • Ubuntu 18.04改为使用/etc/resolv.conf。现在默认情况下它使用本地DNS缓存127.0.0.53。这在集装箱内不起作用,因此Docker将默认使用Google的8.8.8.8 DNS服务器,这可能会破坏防火墙后面的人。
  • sudo systemctl restart network-manager实际上是一个符号链接(cat /etc/resolv.conf),在Ubuntu 18.04中默认指向systemd-resolved to generate /etc/resolv.conf(127.0.0.53)。
  • 只需将符号链接更改为指向/etc/resolv.conf,其中列出了真正的DNS服务器: ls -l /etc/resolv.conf
  • 在主机上验证:/run/systemd/resolve/stub-resolv.conf

现在你应该在主机上有一个有效的/run/systemd/resolve/resolv.conf,以便将docker复制到容器中。


4
投票

首先检查你是否有连接,直接ping到sudo ln -sf /run/systemd/resolve/resolv.conf /etc/resolv.conf指向的ip cat /etc/resolv.conf

/etc/resolv.conf

如果你仍然无法访问主机,那不是dns问题。

此外,如果你有互联网连接,你可以做一个黑客。只需在91.189.92.201文件中添加一行并解决问题:

archive.ubuntu.com


2
投票

我在两个不同的情况下遇到了这个问题,而且决议是不同的......

第一个使用Win7 + virtualbox(Xubuntu 16.04)此评论完成了这项工作:ping 91.189.92.201

我修改文件/ etc / default / docker:

DOCKER-OPTS =“ - ip-masq = true --dns my_ip_dns_win --dns 8.8.8.8 --dns 8.8.4.4”并运行sudo service docker restart

Xubuntu OS上的第二个(ubuntu 16.04)先前的解决方案还不够。这个评论完成了这项工作:/etc/hosts我必须在文件/etc/NetworkManager/NetworkManager.conf中注释一行:

dns=dnsmasq

然后跑

sudo重启网络管理员


1
投票

我正在使用Mint的版本并在安装Docker并尝试创建Ubuntu的映像以执行apt-get update命令无法识别,为了解决问题,我确实下台了

91.189.92.201 archive.ubuntu.com

0
投票

https://stackoverflow.com/a/29659783/2260796我遇到了与https://github.com/docker/docker/issues/1809相同的问题。我通过在Dockerfile中添加docker run -it -p 8080:80 ubuntu /bin/bash echo "91.189.92.201 archive.ubuntu.com" >> /etc/hosts cat /etc/hosts apt-get update 条目来解决这个问题。

© www.soinside.com 2019 - 2024. All rights reserved.