ubuntu Docker apt-get更新失败

mdfafbf1  于 2022-11-22  发布在  Docker
关注(0)|答案(9)|浏览(457)

有人能帮我在我的docker容器中运行apt-get吗?每当我尝试在我的docker容器中运行任何apt-get命令时,命令都失败了。我正在运行Docker版本1.1.1,在ubuntu 12.04上构建bd 609 d2。
当我这样做

$ sudo docker run -i -t ubuntu:14.04 /bin/bash
# apt-get update

我收到错误消息
无法解析'archive.ubuntu.com'
我尝试取消注解/etc/default/docker中的以下行
“--域名系统8.8.8.8--域名系统8.8.4.4“
但我还是无法ping到google.com
ping:未知主机
我已确认容器正在使用DNS服务器8.8.8.8和8.8.4.4
/#目录/etc/解析配置文件
域名服务器8.8.8.8
域名服务器8.8.4.4
并且我能够ping通两台服务器,因此我非常确定防火墙不仅仅是在丢弃我的数据包。
任何帮助将不胜感激!
谢谢你!

juzqafwq

juzqafwq1#

谢谢你所有的帮助!我发现这是一个dns的问题,这是因为一个防火墙.搜索了一些更多后,我发现这个问题,我是无法找到,而搜索'docker apt-get失败'
Docker - Network calls fail during image build on corporate network
他的问题和我的问题很相似,他的解决方案帮助我解决了这个问题。我已经复制了他的解决方案,以供将来发现这个问题的人使用。
这些谷歌服务器无法从我们的防火墙后访问,这就是为什么我们无法解析任何URL。
修复程序是告诉Docker要使用哪些DNS服务器。此修复程序取决于您如何安装Docker:Ubuntu软件包
如果您安装了Ubuntu软件包,请编辑/etc/default/docker并添加以下行:
插入选项="--dns<your_dns_server_1>--dns<your_dns_server_2>“
您可以将任意数量的DNS服务器添加到此配置中。编辑完此文件后,您需要重新启动Docker服务:
sudo服务Docker重新启动
二进制文件
如果您已经通过二进制文件方法(即没有软件包)安装了Docker,那么您可以在启动Docker守护程序时设置DNS服务器:

  • -dns--dns &---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
ccrfmcuu

ccrfmcuu2#

如果您看到类似Could not resolve ...的错误,则可能是DNS配置。
首先要检查的是在docker容器中运行cat /etc/resolv.conf。如果它有一个无效的DNS服务器,如nameserver 127.0.x.x,那么容器将无法将域名解析为ip地址,因此ping google.com将失败。
第二件要检查的事情是在主机上运行cat /etc/resolv.conf。Docker基本上是在每次启动容器时将主机的/etc/resolv.conf复制到容器中。因此,如果主机的/etc/resolv.conf是错误的,那么Docker容器也会如此。
如果你发现主机的/etc/resolv.conf是错误的,那么你有两个选择:
1.在daemon.json中对DNS服务器进行硬编码。这很容易,但如果您希望DNS服务器发生变化,则不理想。
1.修复主机的/etc/resolv.conf。这有点棘手,但它是动态生成的,并且您没有对DNS服务器进行硬编码。

1.将DNS服务器硬编码在Docker守护进程.json中

  • 编辑/etc/docker/daemon.json
{
    "dns": ["10.1.2.3", "8.8.8.8"]
}
  • 重新启动Docker守护程序以使这些更改生效:

sudo systemctl restart docker

  • 现在,当你运行/启动一个容器时,docker将用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(带有#
  • 重新启动NetworkManager以重新生成/etc/resolv.conf

x1米19英寸1x

  • 在主机上验证:x1米20英寸
    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

  • 在主机上验证:x1米28英寸1x

现在主机上应该有一个有效的/etc/resolv.conf,以便Docker复制到容器中。

tzxcd3kk

tzxcd3kk3#

$ 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秒。
第一次
以上命令对我来说花了大约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容器中,所以我按了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

v1uwarro

v1uwarro4#

首先检查是否已连接,直接ping archive.ubuntu.com指向的ip 91.189.92.201
ping 91.189.92.201
如果你仍然不能到达主机,这不是一个dns的问题。
另外,如果你有互联网连接,你可以做一个黑客。只要把一行到/etc/hosts文件和问题解决:
91.189.92.201 archive.ubuntu.com

sczxawaw

sczxawaw5#

我正在使用的版本的薄荷和安装Docker后,并试图创建一个映像的Ubuntu做apt-get更新命令不承认,以补救问题,我没有下台

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
cwdobuhd

cwdobuhd6#

我在两个不同的案例中遇到了这个问题,解决方案也不同...

***第一个使用Win7 + virtualbox的版本(Xubuntu 16.04)***此注解完成了工作:https://stackoverflow.com/a/29659783/2260796

我修改了文件/etc/default/docker:
然后8.8.8.88.8.4.4运行sudo服务对接器重新启动

***Xubuntu操作系统上的第二个(ubuntu16.04)***之前的解决方案还不够。下面的评论起到了作用:https://github.com/docker/docker/issues/1809我不得不注解文件/etc/NetworkManager/NetworkManager.conf中一行:

dns=域名解析器

然后运行
sudo重启网络管理器

dnph8jn4

dnph8jn47#


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

epfja78i

epfja78i8#

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

uujelgoq9#

只要用“ubuntu:20.04”图像(以前的LTS)代替“ubuntu”。它对我很有效。

相关问题