有人能帮我在我的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通两台服务器,因此我非常确定防火墙不仅仅是在丢弃我的数据包。
任何帮助将不胜感激!
谢谢你!
9条答案
按热度按时间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服务器:
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
sudo systemctl restart docker
daemon.json
中的值填充/etc/resolv.conf
。2.修复主机的
/etc/resolv.conf
A. Ubuntu 16.04及更早版本
/etc/resolv.conf
由NetworkManager动态生成。/etc/NetworkManager/NetworkManager.conf
中的行dns=dnsmasq
(带有#
)/etc/resolv.conf
:x1米19英寸1x
B. 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
现在主机上应该有一个有效的
/etc/resolv.conf
,以便Docker复制到容器中。tzxcd3kk3#
没有错误!-注意添加的
--net=host
。下面我将展示如何重现错误。
我在一台只安装了Ubuntu 18.04的干净机器上做了以下操作。
首先安装Docker。复制粘贴 * 一次一行 * 并在 * 每行 * 后按Enter键:
上面两个命令中的第二个(一个命令分成两行)是 * 可选的 *,对我来说花了大约20秒。
第一次
以上命令对我来说花了大约7秒。
sudo
作为docker
的前缀:注销并重新登录。
确认
docker
现在已添加到您的组中:现在到了核心部分的兴趣:
请注意我刚刚是如何重新创建OP所描述的错误的!
OP得到了
Could not resolve 'archive.ubuntu.com'
,而我得到了
Failed to fetch http://archive.ubuntu.com
。但根本原因是一样的:对接容器不能访问因特网。
我不想呆在这个糟糕的Docker容器中,所以我按了Ctrl + D。
也不想留着它,所以我留着:
它告诉我在我的例子中
CONTAINER ID
是c05ec98236f0
。我取出这个容器:
注意一些不会给予我错误的东西。
好了没有错误!
参考文献:
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
v1uwarro4#
首先检查是否已连接,直接ping
archive.ubuntu.com
指向的ip91.189.92.201
:ping 91.189.92.201
如果你仍然不能到达主机,这不是一个dns的问题。
另外,如果你有互联网连接,你可以做一个黑客。只要把一行到
/etc/hosts
文件和问题解决:91.189.92.201 archive.ubuntu.com
sczxawaw5#
我正在使用的版本的薄荷和安装Docker后,并试图创建一个映像的Ubuntu做apt-get更新命令不承认,以补救问题,我没有下台
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重启网络管理器
dnph8jn47#
我在使用
docker-compose
时遇到了同样的问题。我通过在Dockerfile中添加ENV http_proxy 'proxy.com'
条目来解决这个问题。epfja78i8#
我使用的是Jenkins基础映像,无论我做什么,apt-get更新总是失败。最后,这一点有所帮助,删除了***/var/lib/apt/lists/*和/etc/apt/sources.list.d/*****。
uujelgoq9#
只要用“ubuntu:20.04”图像(以前的LTS)代替“ubuntu”。它对我很有效。