有人可以帮助我在我的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 nameserver 8.8.8.8 nameserver 8.8.4.4
我能够ping两台服务器,所以我很确定防火墙不只是丢弃我的数据包 .
任何帮助都将不胜感激!
谢谢!
5 回答
感谢你的帮助!我发现这是一个dns问题而且是因为防火墙 . 在搜索了一些之后我发现了一个我在搜索'docker apt-get fail'时无法找到的问题
Docker - Network calls fail during image build on corporate network
他的问题与我的问题类似,解决方案帮助我解决了问题 . 我已经为将来发现这个问题的任何人复制了他的解决方案 .
如果您看到类似
Could not resolve ...
的错误,则可能是DNS配置 .首先要检查的是在 docker container 中运行
cat /etc/resolv.conf
. 如果它具有无效的DNS服务器,例如nameserver 127.0.x.x
,则容器将无法将域名解析为IP地址,因此ping google.com
将失败 .要检查的第二件事是在 host machine 上运行
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. Hardcode DNS server in docker daemon.json
/etc/docker/daemon.json
重新启动docker守护程序以使这些更改生效:
sudo systemctl restart docker
现在,当您运行/启动容器时,docker将使用
daemon.json
中的值填充/etc/resolv.conf
.2. Fix the hosts's /etc/resolv.conf
A. Ubuntu 16.04 and earlier
对于Ubuntu 16.04及更早版本,
/etc/resolv.conf
由NetworkManager动态生成 .在
/etc/NetworkManager/NetworkManager.conf
注释掉dns=dnsmasq
(带#
)行重新启动NetworkManager以重新生成
/etc/resolv.conf
:sudo systemctl restart network-manager
在主机上验证:
cat /etc/resolv.conf
B. Ubuntu 18.04 and later
Ubuntu 18.04更改为使用systemd-resolved to generate /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
的ip91.189.92.201
:ping 91.189.92.201
如果你仍然无法访问主机,那不是dns问题 .
此外,如果你有互联网连接,你可以做一个黑客 . 只需在
/etc/hosts
文件中输入一行并解决问题:91.189.92.201 archive.ubuntu.com
我在两个不同的案例中遇到了这个问题,而且决议是不同的......
First one with Win7 + virtualbox(Xubuntu 16.04) 此评论完成了这项工作:https://stackoverflow.com/a/29659783/2260796
我修改文件/ etc / default / docker:
Second one on a Xubuntu OS (ubuntu 16.04) 先前的决议还不够 . 这条评论完成了这项工作:https://github.com/docker/docker/issues/1809我必须在文件/etc/NetworkManager/NetworkManager.conf中注释一行:
然后跑
sudo重启网络管理员
我正在使用Mint的版本并在安装Docker并尝试创建Ubuntu的映像以执行apt-get update命令无法识别,为了解决问题,我确实下台了