繁体   English   中英

Docker apt-get 更新失败

[英]Docker apt-get update fails

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

名称服务器 8.8.8.8

名称服务器 8.8.4.4

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

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

谢谢!

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

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

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

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

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

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

DOCKER_OPTS="--dns <your_dns_server_1> --dns <your_dns_server_2>"

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

须藤服务泊坞窗重启

二进制文件

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

须藤 docker -d -D --dns --dns &

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

首先要检查的是在docker 容器中运行cat /etc/resolv.conf 如果它有一个无效的 DNS 服务器,例如nameserver 127.0.xx ,那么容器将无法将域名解析为 ip 地址,因此ping google.com将失败。

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

如果你发现宿主机的/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

  • 现在,当您运行/启动容器时, daemon.json将使用daemon.json的值填充/etc/resolv.conf


2.修复主机的/etc/resolv.conf

A. Ubuntu 16.04 及更早版本

  • 对于 Ubuntu 16.04 及更早版本,/ /etc/resolv.conf是由 NetworkManager 动态生成的。

  • /etc/NetworkManager/NetworkManager.conf 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来生成/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 复制到容器中。

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

ping 91.189.92.201

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

此外,如果您有互联网连接,则可以进行黑客攻击。 只需将一行放入/etc/hosts文件即可解决问题:

91.189.92.201 archive.ubuntu.com

我使用的是 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

我在两种不同的情况下遇到了这个问题,解决方案也不同......

第一个使用 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 操作系统 (ubuntu 16.04) 上的第二个解决方案是不够的。 这条评论完成了这项工作: https : //github.com/docker/docker/issues/1809我不得不在文件 /etc/NetworkManager/NetworkManager.conf 中评论一行:

dns=dnsmasq

然后运行

须藤重启网络管理器

docker-compose 出错 我在使用docker-compose遇到了同样的问题。 我通过ENV http_proxy 'proxy.com'添加ENV http_proxy 'proxy.com'条目来解决这个问题。

$ 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

可选——如果你不想每次都用sudo前缀docker

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.

瞧! 没有错误!

参考:
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

我使用的是 Jenkins 基础镜像,无论我做什么,apt-get update 总是失败。 最终,这有帮助,删除/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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM