[英]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' 时找不到
他的问题与我的相似,解决方案帮助我解决了问题。 我已经为将来发现这个问题的任何人复制了他的解决方案。
这些 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个选择:
在 daemon.json 中硬编码 DNS 服务器。 这很容易,但如果您希望 DNS 服务器发生更改,则这并不理想。
修复主机的/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
然后运行
须藤重启网络管理器
$ 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 ID
是c05ec98236f0
。
我删除了这个容器:
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.