Docker apt-get更新失败

jba*_*dua 30 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
Run Code Online (Sandbox Code Playgroud)

我说错了

无法解析'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两台服务器,所以我很确定防火墙不只是丢弃我的数据包.

任何帮助都将不胜感激!

谢谢!

jba*_*dua 27

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

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

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

我们的防火墙后面无法访问这些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&

  • 对于那些不知道你的dns是什么的人来说,https://robinwinslow.uk/2016/06/23/fix-docker-networking-dns/ (3认同)
  • 仅供参考,这个答案(etc/default/docker)适用于使用 Upstart 的旧版 Ubuntu。从 Ubuntu 16.04 开始,它使用 systemd,因此您需要按照 /sf/answers/3576257961/ 进行操作。 (2认同)

Hen*_*nke 11

$ sudo docker run -i -t --net=host ubuntu /bin/bash\n# apt-get update\n
Run Code Online (Sandbox Code Playgroud)\n

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

\n
\n

下面我将展示如何重现该错误。
\n我在一台干净的机器上执行了以下操作,除了 Ubuntu 18.04 \n安装了其他任何东西。

\n

首先安装docker。一次复制粘贴一行,并\n在每行后面\n敲击:Enter

\n
sudo apt update                         # took 11 seconds for me\nsudo apt install -y apt-transport-https ca-certificates \\\ncurl software-properties-common\n
Run Code Online (Sandbox Code Playgroud)\n

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

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

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

\n
sudo apt update                         # ~3 seconds this time\nsudo apt install -y docker-ce           # ~1 minute for me\n
Run Code Online (Sandbox Code Playgroud)\n

可选- 如果您不喜欢每次都docker添加前缀:sudo

\n
sudo usermod -aG docker ${USER}\n
Run Code Online (Sandbox Code Playgroud)\n

注销并重新登录。
\n确认docker现在已添加到您的组中:

\n
id -nG\n
Run Code Online (Sandbox Code Playgroud)\n
\n

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

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

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

\n

我不想留在这个糟糕的 docker 容器中,所以我点击了Ctrl + D
\n也不想保留它,所以我这样做:

\n
sudo docker container ps -a\n
Run Code Online (Sandbox Code Playgroud)\n

这告诉我,CONTAINER ID在我的例子中是c05ec98236f0.

\n

我删除这个容器:

\n
sudo docker container rm c05ec98236f0\n
Run Code Online (Sandbox Code Playgroud)\n

注意一些不会给我错误的东西。

\n
$ sudo docker run -it --net=host ubuntu bash\n# apt update                            # ~7 seconds\nGet:1 http://archive.ubuntu.com/ubuntu focal InRelease [265 kB]\n...\nFetched 16.4 MB in 4s (4332 kB/s)\nReading package lists... Done\nBuilding dependency tree\nReading state information... Done\n3 packages can be upgraded. Run \'apt list --upgradable\' to see them.\n
Run Code Online (Sandbox Code Playgroud)\n

瞧\xc3\xa0!没有错误!

\n

参考文献:\
n https://askubuntu.com/questions/1162163#1162198\n
https://www.digitalocean.com/community/tutorials/how-to-install-and-use-docker-on-ubuntu-18 -04
\n /sf/ask/221263661/#31424970
\n /sf/ask/3032146351/#43317607

\n


wis*_*cky 9

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

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

要检查的第二件事是cat /etc/resolv.conf主机上运行./etc/resolv.conf每次启动容器时,Docker基本上都会将主机复制到容器中.因此,如果主机/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"]
    }
    
    Run Code Online (Sandbox Code Playgroud)
  • 重新启动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(用a #) 行/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),/run/systemd/resolve/stub-resolv.conf在Ubuntu 18.04中默认指向(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复制到容器中.