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

Posted

技术标签:

【中文标题】Docker构建“无法解析\'archive.ubuntu.com\'”apt-get无法安装任何东西【英文标题】:Docker build "Could not resolve 'archive.ubuntu.com'" apt-get fails to install anythingDocker构建“无法解析'archive.ubuntu.com'”apt-get无法安装任何东西 【发布时间】:2014-09-19 09:33:21 【问题描述】:

我一直在尝试在以前工作的各种文件上运行 Docker 构建,现在这些文件不再工作了。

只要 Docker 文件包含任何要安装软件的行,它就会失败并显示一条消息,指出找不到软件包。

RUN apt-get -y install supervisor nodejs npm

日志中出现的常见消息是

Could not resolve 'archive.ubuntu.com'

知道为什么任何软件都无法安装吗?

【问题讨论】:

当机器与网络断开连接时会发生这种情况......我已经看到如果我只发出newgrp docker 而不是完全注销然后登录,那么这种情况会发生在具有新 docker install 的 linux 笔记本电脑上在给自己sudo usermod -aG docker myuserid 之后……它肯定是一个边缘情况,但它确实发生了 【参考方案1】:

按照Matt Carrier 的建议在/etc/default/docker 中取消注释DOCKER_OPTS="--dns 8.8.8.8 --dns 8.8.4.4" 对我有用。也没有将我公司的 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's public DNS server。如果nslookup 失败,您的公司可能会阻止像 8.8.8.8 这样的公共 DNS 服务器(我认为这是出于安全原因)。

您认为将您公司的 DNS 服务器添加到 /etc/default/docker 中的 DOCKER_OPTS 应该可以解决问题,但无论出于何种原因,它都对我不起作用。我在下面描述了对我有用的方法。

解决方案

在主机上(我使用的是 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 配置。”罗宾温斯洛。检索 2016-11-09。 https://robinwinslow.uk/2016/06/23/fix-docker-networking-dns/

【讨论】:

我收到一个错误,更改后无法启动服务。这是因为我修改了 /etc/default/docker 和 /etc/init.d/docker 中的 DOCKER_OPTS。还原更改解决了 docker 服务的启动问题 这对我有用(在公司网络上),而接受的解决方案却没有。 这对我也有效,而接受的解决方案却没有。我使用 nslookup 来获取我的 DNS 服务器 IP,但不是 nmcli。 daemon.json 也适用于我!您可以通过此命令检查您的公司是否已阻止 8.8.8.8 nslookup google.com 8.8.8.8 在我的情况下,我收到此错误 connection timed out; no servers could be reached 我认为/etc/default/docker 对某些人不起作用的原因是(引用文件中的评论)# THIS FILE DOES NOT APPLY TO SYSTEMD【参考方案2】:

经过一番头疼后,我找到了答案。 Could not resolve 'archive.ubuntu.com' 可以通过以下更改来修复:

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

    重启 Docker 服务 sudo service docker restart

    删除缓存了无效 DNS 设置的所有图像。

    重新编译,问题应该就解决了。

归功于Andrew SB

【讨论】:

如果您不想执行上述 #3,也可以添加 --no-cache=true 这对我不起作用,我不知道为什么。我已经断断续续地与这个斗争了好几个星期了。 我在 linux mint 上运行,所以没有 boot2docker。 /etc/default/docker 已创建并具有上面的 DOCKER_OPTS 标志。我重新启动了服务,清除了所有图像和容器,但仍然没有。 @CoreyOgburn 我也会尝试 jschorr 上面提到的 --no-cache=true。例如:docker build --no-cache=true ... 我跑了docker build --no-cache=true -t docker-whale .,但似乎没有发生任何不同。【参考方案3】:

我遇到了同样的问题,但是既不取消注释 /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)。-连接(111:连接被拒绝)”,发现使用--network=host 现在已经解决了我的问题 经过大量故障排除后,这是唯一对我有用的方法。【参考方案4】:

我相信Matt Carrier's answer 是解决这个问题的正确方法。但是,在实现之后,我仍然观察到相同的行为:could not resolve 'archive.ubuntu.com'

这导致我最终发现我连接的网络正在阻止公共 DNS。这个问题的解决方案是将我的 Docker 容器配置为使用与我的主机(我运行 Docker 的机器)使用相同的名称服务器。

我是如何分类的:

    自从我阅读 Docker 文档以来,我已经在我的机器上安装了一个示例映像。我能够启动一个新容器来运行该映像并在该容器中创建一个新的 bash 会话:docker run -it docker/whalesay bash 容器是否有 Internet 连接?:ping 172.217.4.238 (google.com) 容器可以解析主机名吗? ping google.com

在我的情况下,第一个 ping 导致响应,第二个没有。

我是如何解决的:

一旦我发现 DNS 在容器内无法正常工作,我就验证了我可以在主机上复制相同的行为。 nslookup google.com 在主机上解决得很好。但是,nslookup google.com 8.8.8.8nsloookup 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 文件中。

【讨论】:

获取地址名称服务器的具体命令:nmcli device show &lt;interfacename&gt; | grep IP4.DNS (Ubuntu >= 15) 和 nmcli dev list iface &lt;interfacename&gt; | grep IP4 (Ubuntu Marty Fried. 这是一个更广泛的答案。当我切换到我的办公室网络或网络发生变化时,我总是遇到问题。添加您公司的 DNS 服务器可解决查找问题。 非常有指导意义!很难找到向您展示如何验证问题,然后提供修复(并验证修复是否有效)的答案。很好的故障排除! 嘿,你能帮帮我吗?我有同样的问题,但我的主机是一台 Windows 机器,我试图在其中运行我的 docker 容器并尝试在那里配置 Ubuntu 映像。当您在这里谈论名称服务器时,是指我的Windows机器的DNS服务器地址吗?在这方面,它是主要的还是次要的? 这是我面临的确切问题,因为我的组织阻止了公共 DNS 并在 DOCKER_OPTS 下的 /etc/default/docker 中设置组织的 DNS 工作并解决了问题。所有人都欢呼这个答案......【参考方案5】:

将本地 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... :)

【讨论】:

【参考方案6】:

对于同样遇到此问题的任何人,我通过编辑 /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。希望这对同样遇到此问题的人有所帮助。

【讨论】:

如果您指定编辑 docker 文件的方式会很有帮助 在 Ubuntu 18.04 上:ifconfig docker0【参考方案7】:

我在谷歌搜索后找到了this answer。我使用的是 Windows,所以上面的一些答案不适用于我的文件系统。

基本运行:

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

我相信这只会覆盖与8.8.8.8 一起使用的现有名称服务器。它对我有用!

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

【讨论】:

这在 Windows 10 上对我不起作用,因为 ssh 不存在? @Seanny123 我已经有一段时间没有做任何事情了,但我也在 Windows 10 上。我当时可能一直在使用旧的Docker Toolbox?否则你可能需要enable the Windows SSH Client。我可能会从那个开始。 这对我来说是在我成为 root 后解决的,要做到这一点,请在你进入后发出 sudo -i【参考方案8】:

我只是想为从搜索引擎中遇到此问题的任何人添加一个迟到的回复。

不要这样做:我曾经在 /etc/default/docker 中有一个选项来设置 iptables=false。这是因为 ufw 不起作用(尽管只允许 3 个端口,但一切都打开了)所以我盲目地遵循了这个问题的答案:Uncomplicated Firewall (UFW) is not blocking anything when using Docker 和 this, which was linked in the comments

总的来说,我对 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 解析功能。

我现在期待通过关注these instructions 来重新启用 ufw 功能。

【讨论】:

【参考方案9】:

我有同样的问题,并尝试了提到的步骤,但似乎在刷新网络设置之前都不起作用。

步骤:

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

【讨论】:

【参考方案10】:

我现在也为此苦苦挣扎了一段时间,但这就是Ubuntu 16.04 x64 为我解决的问题。我希望它也能节省一些人的时间。

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

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


    "dns": ["8.8.8.8"]

    使用以下命令重新启动 docker: sudo service docker restart

【讨论】:

似乎与***.com/a/40516974/2308683的解决方案相同 其实不是。 NetworkManager.conf 中的修复对我的情况产生了影响。 我非常怀疑在系统范围内禁用 dnsmasq 是专门针对 Docker 的最佳解决方案 在解决这个问题 2 天后,我正在分享对我有用的方法。【参考方案11】:

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

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

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

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

应用此解决方案How do I configure my static DNS in interfaces? (askubuntu),即将名称服务器添加到/etc/resolvconf/resolv.conf.d/tail

更新 resolvconf(或重启)后。

bash docker run --rm busybox nslookup google.com

立即生效。

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

【讨论】:

【参考方案12】:

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

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

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

在我的情况下,重新启动 docker daemon 对我来说还不够,我必须重新启动我的笔记本电脑才能使其工作。

【讨论】:

【参考方案13】:

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

为我解决了这个问题,在 Windows 10 上使用 Docker Desktop for Windows。

【讨论】:

使用管理员权限重新启动它解决了我的问题。【参考方案14】:

就我而言,防火墙是问题所在。暂时禁用它解决了这个问题。我使用nftables。停止服务就成功了。

sudo systemctl stop nftables.service 

【讨论】:

【参考方案15】:

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

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

    Preferences&gt;Proxies中手动配置代理设置

    将相同的设置添加到 ~/.docker/config.json 内的 config.json 中,例如:

     "proxies":
    
      "default":
      
        "httpProxy": "MYPROXY",
        "httpsProxy": "MYPROXY",
        "noProxy": "MYPROXYWHITELIST"
      
    
    

【讨论】:

【参考方案16】:

在我的例子中,由于我的容器在云环境中,接口的 MTU 不是通常的 1500,而是像 1450,所以我必须配置我的 docker 守护程序以将容器的 MTU 设置为 1450。

  
"mtu": 1454 

看看这个:https://mlohr.com/docker-mtu/

【讨论】:

【参考方案17】:

我的系统中有 dnsmasq 用于 dns 解析,它具有解析 URL 的名称服务器。 Docker 将主机系统的/etc/resolv.conf 复制到容器的/etc/resolv.conf 中,因此没有正确的名称服务器。来自docs:

默认情况下,容器会继承主机的 DNS 设置,如 在/etc/resolv.conf 配置文件中定义。

在主机的/etc/resolv.conf 中添加域名服务器解决了这个问题。

【讨论】:

【参考方案18】:

随着最近的更新,(/etc/docker/daemon.json) 中的以下行是问题的原因:


    "bridge": "none"

删除它,并使用以下命令重新启动 docker 服务:sudo systemctl restart docker

操作系统 (Ubuntu 20.04.3 LTS) 和 Docker (version 20.10.11, build dea9396)

【讨论】:

以上是关于Docker构建“无法解析'archive.ubuntu.com'”apt-get无法安装任何东西的主要内容,如果未能解决你的问题,请参考以下文章

使用新版Golang1.18多段构建制作docker镜像的踩坑经历

docker构建基于docker构建discuz论坛

企业运维实战--最全Docker学习笔记1.Docker简介安装部署镜像构建Dockerfile详解镜像构建镜像优化本地私有仓库搭建

docker之构建镜像

docker入门之三:docker构建私有镜像入门到实践

Linux企业运维——Docker安装部署与镜像构建