Docker apt-get更新失败

时间:2014-07-18 20:06:43

标签: dns ubuntu-12.04 docker

有人可以帮助我在我的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两台服务器,所以我很确定防火墙不只是丢弃我的数据包。

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

谢谢!

8 个答案:

答案 0 :(得分:26)

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

Docker - Network calls fail during image build on corporate network

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

  

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

     

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

     

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

     

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

     

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

     

sudo service docker restart

     

二进制文件

     

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

     

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

答案 1 :(得分:9)

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

要检查的第一件事是在 docker容器中运行cat /etc/resolv.conf。如果它具有无效的DNS服务器,例如nameserver 127.0.x.x,则容器将无法将域名解析为IP地址,因此ping google.com将失败。

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

如果发现主机的/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。修复主机的/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 to generate /etc/resolv.conf。现在默认情况下,它使用本地DNS缓存127.0.0.53。那将无法在容器内运行,因此Docker将默认为Google的8.8.8.8 DNS服务器,这可能会使防火墙后面的人无法使用。

  • /etc/resolv.conf实际上是一个符号链接(ls -l /etc/resolv.conf),在Ubuntu 18.04中默认指向/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复制到容器中。

答案 2 :(得分:4)

首先检查您是否有连接,直接ping到指向91.189.92.201的ip archive.ubuntu.com

ping 91.189.92.201

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

此外,如果您有互联网连接,您可以进行黑客攻击。只需在/etc/hosts文件中添加一行并解决问题:

91.189.92.201 archive.ubuntu.com

答案 3 :(得分:2)

我在两种不同的情况下遇到了这个问题,而且分辨率也不同......

第一个使用Win7 + virtualbox(Xubuntu 16.04) 这条评论完成了这项工作:https://stackoverflow.com/a/29659783/2260796

我修改文件/ 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) 先前的决议还不够。 这条评论完成了这项工作:https://github.com/docker/docker/issues/1809 我必须在文件/etc/NetworkManager/NetworkManager.conf中注释一行:

  

DNS =的dnsmasq

然后运行

sudo restart network-manager

答案 4 :(得分:1)

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

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

答案 5 :(得分:0)

Error with docker-compose docker-compose遇到了同样的问题。我通过在Dockerfile中添加ENV http_proxy 'proxy.com'条目来解决这个问题。

答案 6 :(得分:0)

我一直在使用Jenkins基本映像,无论我做什么,apt-get更新总是失败。 最终,这有所帮助,删除了 / var / lib / apt / lists / /etc/apt/sources.list.d/* * 达到了目的。

USER root
RUN rm -rf /var/lib/apt/lists/*
RUN rm -rf /etc/apt/sources.list.d/*
RUN apt-get update
....Continue using apt-get for installing your stuff..
RUN apt-get install -y maven

答案 7 :(得分:0)

$ sudo docker run -i -t --net=host ubuntu /bin/bash
# apt-get update

没有错误! -注意添加的--net=host


下面我展示了如何重现错误。
我在干净但只有Ubuntu 18.04的干净机器上进行了以下操作 安装在上面。

首先安装docker。一次复制粘贴一行,然后 在每个 之后点击 Enter 行:

sudo apt update                         # took 11 seconds for me
sudo apt install -y apt-transport-https ca-certificates \
curl software-properties-common

上面两个命令中的第二个(一个命令分为两行) 是可选,对我来说大约需要20秒。

echo "cacert=/etc/ssl/certs/ca-certificates.crt" >> ~/.curlrc
curl -fsSL https://download.docker.com/linux/ubuntu/gpg \
| sudo apt-key add -
sudo add-apt-repository "deb [arch=amd64] https://\
download.docker.com/linux/ubuntu $(lsb_release -cs) stable"

上面的命令对我来说花了大约7秒钟。

sudo apt update                         # ~3 seconds this time
sudo apt install -y docker-ce           # ~1 minute for me

可选-如果您不希望每次都在docker前面加上sudo前缀:

sudo usermod -aG docker ${USER}

退出并重新登录。
确认docker现在已添加到您的组中:

id -nG

现在是感兴趣的核心部分:

$ sudo docker run -it ubuntu /bin/bash  # ~10 seconds for me
# apt update                            # first Err after ~1 minute
Err:1 http://archive.ubuntu.com/ubuntu focal InRelease
  Connection failed [IP: 91.189.88.152 80]
Err:2 http://security.ubuntu.com/ubuntu focal-security InRelease
  Connection failed [IP: 91.189.88.152 80]
Err:3 http://archive.ubuntu.com/ubuntu focal-updates InRelease
  Connection failed [IP: 91.189.88.152 80]
Err:4 http://archive.ubuntu.com/ubuntu focal-backports InRelease
  Connection failed [IP: 91.189.88.152 80]
...
W: Failed to fetch http://archive.ubuntu.com/ubuntu/dists/focal/InRelease [...]
...
W: Some index files failed to download. They have been ignored, [...]

请注意我是如何重新创建OP描述的错误的!
OP获得了Could not resolve 'archive.ubuntu.com'
我得到Failed to fetch http://archive.ubuntu.com的时候。
但是根本原因是相同的:docker容器无法访问 互联网。

我不想留在这个坏的Docker容器中,所以我按下了 Ctrl + D
也不希望保留它,所以我这样做:

sudo docker container ps -a

这告诉我,在我的情况下,CONTAINER IDc05ec98236f0

我删除了这个容器:

sudo docker container rm c05ec98236f0

请注意不要给我错误的内容。

$ sudo docker run -it --net=host ubuntu bash
# apt update                            # ~7 seconds
Get:1 http://archive.ubuntu.com/ubuntu focal InRelease [265 kB]
...
Fetched 16.4 MB in 4s (4332 kB/s)
Reading package lists... Done
Building dependency tree
Reading state information... Done
3 packages can be upgraded. Run 'apt list --upgradable' to see them.

Voilà!没错!

参考文献:
https://askubuntu.com/questions/1162163#1162198
https://www.digitalocean.com/community/tutorials/how-to-install-and-use-docker-on-ubuntu-18-04
https://stackoverflow.com/questions/3160909#31424970
https://stackoverflow.com/questions/43316376#43317607