Docker构建“无法解析'archive.ubuntu.com'” apt-get无法安装任何内容


101

我一直在尝试在以前可以使用的各种文件上运行Docker构建,现在不再使用了。

一旦Docker文件包含要安装软件的任何行,它将失败并显示一条消息,指出未找到该软件包。

RUN apt-get -y install supervisor nodejs npm

日志中显示的常见消息是

Could not resolve 'archive.ubuntu.com'

知道为什么不安装任何软件吗?


这将在计算机与网络断开连接时发生...我已经看到,如果我只发出newgrp docker而不是完全注销然后在给自己登录后登录,则在使用新的docker安装的linux笔记本电脑上发生这种 sudo usermod -aG docker myuserid情况。确保它确实发生了
Scott Stensland

Answers:


250

在取消DOCKER_OPTS="--dns 8.8.8.8 --dns 8.8.4.4"/etc/default/docker马特运营商建议没有为我工作。也没有将我公司的DNS服务器放在该文件中。但是,还有另一种方式(请继续阅读)。

首先,让我们验证问题:

$ docker run --rm busybox nslookup google.com   # takes a long time
nslookup: can't resolve 'google.com'   # <--- appears after a long time
Server:    8.8.8.8
Address 1: 8.8.8.8

如果命令似乎挂起,但最终吐出错误“无法解析'google.com'”,那么您和我有同样的问题。

nslookup命令查询DNS服务器8.8.8.8,以将“ google.com”的文本地址转换为IP地址。具有讽刺意味的是,8.8.8.8是Google的公共DNS服务器。如果nslookup失败,则您的公司可能会阻止8.8.8.8之类的公共DNS服务器(出于安全原因,我认为这是假定的)。

你可能会认为,将您的公司的DNS服务器DOCKER_OPTS/etc/default/docker应该做的伎俩,但无论出于何种原因,它并没有为我工作。我在下面描述对我有用的东西。

解决方案

在主机上(我使用的是Ubuntu 16.04),查找主要和辅助DNS服务器地址:

$ nmcli dev show | grep 'IP4.DNS'
IP4.DNS[1]:              10.0.0.2
IP4.DNS[2]:              10.0.0.3

使用这些地址,创建一个文件/etc/docker/daemon.json

$ sudo su root
# cd /etc/docker
# touch daemon.json

放入/etc/docker/daemon.json

{                                                                          
    "dns": ["10.0.0.2", "10.0.0.3"]                                                                           
}     

从根目录退出:

# exit

现在重启docker:

$ sudo service docker restart

验证

现在检查添加/etc/docker/daemon.json文件是否可以将“ google.com”解析为IP地址:

$ docker run --rm busybox nslookup google.com
Server:    10.0.0.2
Address 1: 10.0.0.2
Name:      google.com
Address 1: 2a00:1450:4009:811::200e lhr26s02-in-x200e.1e100.net
Address 2: 216.58.198.174 lhr25s10-in-f14.1e100.net

参考资料

我的解决方案基于Robin Winslow的文章,该解决方案值得所有赞扬。谢谢,罗宾!

“修复Docker的网络DNS配置。” 罗宾·温斯洛(Robin Winslow)。检索2016-11-09。https://robinwinslow.uk/2016/06/23/fix-docker-networking-dns/


3
我收到一个错误,更改后无法启动该服务。这是因为我在/ etc / default / docker和/etc/init.d/docker中修改了DOCKER_OPTS。还原更改解决了
docker

7
这对我(在公司网络上)有效,而公认的解决方案却没有。
David Ebbo '17

1
这对我也很有效,但是公认的解决方案却没有。我使用nslookup来获取DNS服务器IP,尽管不是nmcli。
Necro

2
daemon.json也对我有用!您可以检查您的公司是否已通过此命令阻止了8.8.8.8。nslookup google.com 8.8.8.8就我而言,是我收到了此错误connection timed out; no servers could be reached
ROTOGG

3
我认为/etc/default/docker对某些人不起作用的原因是(引用文件中的评论)# THIS FILE DOES NOT APPLY TO SYSTEMD
Jakub Bochenski

88

经过很多头痛后,我找到了答案。Could not resolve 'archive.ubuntu.com'可以通过进行以下更改来修复:

  1. 取消注释以下行 /etc/default/docker
    DOCKER_OPTS="--dns 8.8.8.8 --dns 8.8.4.4"

  2. 重新启动Docker服务 sudo service docker restart

  3. 删除所有已缓存无效DNS设置的图像。

  4. 重新构建,问题应该解决。

归功于Andrew SB


7
您也可以添加--no-cache = true,如果您不想执行上述#3
jschorr 2014年

8
这对我不起作用,我也不知道为什么。我一直在断断续续地战斗了几个星期。
科里·奥格本

2
我在linux mint上运行,所以没有boot2docker。/ etc / default / docker已创建,并在上面具有DOCKER_OPTS标志。我已经重新启动了服务,清除了所有图像和容器,但什么也没有。
科里·奥格本

2
@CoreyOgburn我也会尝试jschorr提到的--no-cache = true。例如:docker build --no-cache=true ...
马特·卡里尔

6
我跑了,docker build --no-cache=true -t docker-whale .但似乎没什么不同。
科里·奥格本

46

我遇到了同样的问题,但是无需取消注释/ etc / default / docker dns条目或编辑构建容器中的/etc/resolv.conf/etc/docker/daemon.json对我有帮助。

但是,在我使用--network = host选项进行构建之后,解析又很好了。

docker build --network=host -t my-own-ubuntu-like-image .

也许这会再次帮助某人。


很长时间以来,我一直在收到一个不同的错误“无法连接到archive.ubuntu.com:80(xxxx)。-connect(111:连接被拒绝)”,发现使用--network = host现在已修复我的问题
Eric Arseneau

经过大量的故障排除后,这是唯一对我有用的方法。
math0ne

15

我相信Matt Carrier的答案是解决此问题的正确方法。但是,实施后,我仍然观察到相同的行为:could not resolve 'archive.ubuntu.com'

这使我最终发现我连接的网络阻止了公共DNS。解决此问题的方法是将Docker容器配置为使用与主机(运行Docker的计算机)所使用的名称服务器相同的名称服务器。

我如何分类:

  1. 由于我正在研究Docker文档,因此我已经在机器上安装了示例映像。我能够启动一个新容器来运行该映像并在该容器中创建一个新的bash会话:docker run -it docker/whalesay bash
  2. 容器是否可以连接互联网?ping 172.217.4.238:(google.com)
  3. 容器可以解析主机名吗? ping google.com

就我而言,第一个ping结果是响应,第二个则没有。

我如何解决:

一旦发现DNS在容器内不起作用,我便验证了可以在主机上复制相同的行为。nslookup google.com在主机上解决就好了。但是,nslookup google.com 8.8.8.8还是nsloookup google.com 8.8.4.4超时。

接下来,通过运行nm-tool(在Ubuntu 14.04上),找到了主机正在使用的名称服务器。为了获得快速反馈,我再次启动了示例图像,并将名称服务器的IP地址添加到了容器的resolv.conf文件:中sudo vi /etc/resolv.conf。保存后,我再次尝试ping(ping google.com),这一次成功了!

请注意,对容器的resolv.conf所做的更改不是永久性的,并且在重新启动容器后将丢失。就我而言,更合适的解决方案是将网络名称服务器的IP地址添加到主机的/etc/default/docker文件中。


2
获取地址名称服务器的具体命令:nmcli device show <interfacename> | grep IP4.DNS(Ubuntu> = 15)和nmcli dev list iface <interfacename> | grep IP4(Ubuntu <15)。信用:马蒂·弗里德(Marty Fried)
r0estir0bbe

这是一个更广泛的答案。当我切换到办公室网络或网络发生更改时,我总是会遇到问题。添加公司的DNS服务器可解决查找问题。
gvd

1
很有指导意义!很少会找到答案,向您展示如何验证问题,然后提供修复程序(并验证该修复程序有效)。很好的故障排除!
马修·克劳斯

嘿,你能帮帮我吗?我遇到了同样的问题,但是我的主机是Windows计算机,试图在其中运行docker容器并尝试在其中配置Ubuntu映像。当您在此处谈论名称服务器时,这是否意味着我的Windows计算机的DNS服务器地址?在那方面,它会是主要的还是次要的?
CodeHunter

这是我遇到的确切问题,因为我的组织阻止了公共DNS并在DOCKER_OPTS下的/ etc / default / docker中设置了组织的DNS,并且已解决问题。所有人都
称赞

7

在将本地dns ip添加到默认的docker文件后,它开始为我工作...请找到以下步骤...

$ nm-tool # (will give you the dns IP)

DNS:172.168.7.2

$ vim /etc/default/docker # (uncomment the DOCKER_OPTS and add DNS IP)
DOCKER_OPTS="--dns 172.168.7.2 --dns 8.8.8.8 --dns 8.8.4.4"

$ rm `docker ps --no-trunc -aq` # (remove all the containers to avoid DNS cache)

$ docker rmi $(docker images -q) # (remove all the images)

$ service docker restart #(restart the docker to pick up dns setting)

现在继续构建docker ... :)


7

对于也有此问题的任何人,我都/etc/default/docker按照其他答案和问题的建议通过编辑文件解决了我的问题。但是我不知道将什么IP用作DNS。

不久之后,我发现我必须ifconfig docker在主机上运行才能显示docker网络接口的IP。

docker0   Link encap:Ethernet  Endereço de HW 02:42:69:ba:b4:07  
          inet end.: 172.17.0.1  Bcast:0.0.0.0  Masc:255.255.0.0
          endereço inet6: fe80::42:69ff:feba:b407/64 Escopo:Link
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Métrica:1
          pacotes RX:8433 erros:0 descartados:0 excesso:0 quadro:0
          Pacotes TX:9876 erros:0 descartados:0 excesso:0 portadora:0
          colisões:0 txqueuelen:0 
          RX bytes:484195 (484.1 KB) TX bytes:24564528 (24.5 MB)

172.17.0.1我而言。希望这对遇到此问题的所有人有所帮助。


7
如果您指定编辑
docker

1
在Ubuntu 18.04上:ifconfig docker0
自动变形

6

经过一番Google搜索,我找到了这个答案。我正在使用Windows,因此上述某些答案不适用于我的文件系统。

基本上运行:

docker-machine ssh default
echo "nameserver 8.8.8.8" > /etc/resolv.conf

8.8.8.8我相信,这将覆盖现有的名称服务器。它为我工作!

根据一些评论,您可能必须是root。为此,请发出sudo -i


这在Windows 10上对我ssh不起作用,因为不存在?
Seanny123 '18

@ Seanny123自从我做任何事情以来已经有一段时间了,但是我也在Windows 10上。我当时可能正在使用旧的Docker Toolbox?否则,您可能需要启用Windows SSH客户端。我可能从那开始。
Engineero

1
在我扎根后,这个问题对我有效,要做到这一点,sudo -i请在您进入时发布
MediaVince

5

我只想为从搜索引擎中遇到此问题的任何人添加最新答复。

不要这样做:我曾经在/ etc / default / docker中有一个选项来设置iptables=false。这是因为ufw无法正常工作(即使只允许3个端口也被打开了),所以我盲目地遵循了这个问题的答案:使用Docker时,不复杂的防火墙(UFW)不会阻塞任何东西,这在注释

我对iptables规则/ nat /路由的了解非常低,因此为什么我可能会做一些不合理的事情。

原来,我可能对它进行了错误配置,并杀死了容器内的DNS解析。当我运行一个交互式容器终端时:docker run -i -t ubuntu:14.04 /bin/bash

我得到了以下结果:

root@6b0d832700db:/# ping google.com
ping: unknown host google.com

root@6b0d832700db:/# cat /etc/resolv.conf
search online.net
nameserver 8.8.8.8
nameserver 8.8.4.4

root@6b0d832700db:/# ping 8.8.8.8
PING 8.8.8.8 (8.8.8.8) 56(84) bytes of data.
64 bytes from 8.8.8.8: icmp_seq=1 ttl=56 time=1.76 ms
64 bytes from 8.8.8.8: icmp_seq=2 ttl=56 time=1.72 ms

恢复我所有的ufw配置(before.rules),禁用ufw并从/ etc / default / docker中删除iptables = false还原了容器的DNS解析功能。

我现在期待通过遵循这些说明来重新启用ufw功能。


3

我遇到了同样的问题,并尝试了上述步骤,但在刷新网络设置之前似乎没有任何效果。

步骤:

  1. 如前所述,添加DOCKER_OPTS="--dns 8.8.8.8 --dns 8.8.4.4 --ip-masq=true"/etc/default/docker
  2. 使用手动刷新PREROUTING表的内容iptables -t nat -F POSTROUTING。运行此命令后,重新启动docker,它将使用新的IP范围初始化nat表。

3

对我来说同样的问题(在Ubuntu Xenial上)。

  • docker run --dns ... 用于工作的容器。
  • docker build(docker-compose等)更新docker守护程序选项不起作用。

在分析docker日志(journalctl -u docker.service)后,如果发现有关应用resolvconf错误的警告。

之后,我发现我们的公司名称服务器已添加到网络接口,但未添加到resolvconf中。

应用此解决方案如何在接口中配置我的静态DNS?(askubuntu)即将名称服务器添加到/etc/resolvconf/resolv.conf.d/tail

更新resolvconf之后(或重新启动)。

bash docker run --rm busybox nslookup google.com

立即工作。

我所有的docker-compose构建现在都在工作。


2

我今天遇到了同样的问题,我只是在/ etc / default / docker下面添加了一行

DOCKER_OPTS="--dns 172.18.20.13 --dns 172.20.100.29 --dns 8.8.8.8"

然后重新启动我的笔记本电脑。

就我而言,重新启动docker daemon对我来说还不够,我必须重新启动我的笔记本电脑才能使其正常工作。


2

在花太多时间在其他解决方案上之前,只需重新启动Docker试。

在Windows 10上使用Windows的Docker桌面为我解决了该问题。


以管理员权限重新启动它可以解决我的问题。
静脉

1

我现在也为此苦了一段时间,但这正是我解决它的原因Ubuntu 16.04 x64。我希望它也可以节省人的时间。

  1. /etc/NetworkManager/NetworkManager.conf:注释掉 #dns=dnsmasq

  2. 创建(或修改)/etc/docker/daemon.json

{
    "dns": ["8.8.8.8"]
}
  1. 使用以下命令重启docker: sudo service docker restart


其实并不是。NetworkManager.conf中的修复程序对我的情况有所不同。
惊叹

我非常怀疑禁用整个系统的dnsmasq是专门针对Docker的最佳解决方案
OneCricketeer

我为这个问题奋斗了2天之后,分享了对我有用的东西。
惊叹

这对我不起作用
desmond13

0

在我的系统(macOS High Sierra 10.13.6带有Docker 2.1.0.1)上,这是由于公司代理。

我通过两个步骤解决了这个问题:

  1. 在中手动配置代理设置 Preferences>Proxies
  2. 将相同的设置添加到您的config.json中,~/.docker/config.json如下所示:

     "proxies":
    {
      "default":
      {
        "httpProxy": "MYPROXY",
        "httpsProxy": "MYPROXY",
        "noProxy": "MYPROXYWHITELIST"
      }
    }
    
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.