有人可以帮助我在我的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两台服务器所以我很确定防火墙不只是丢弃我的数据包。
任何帮助都将不胜感激!
谢谢!
感谢你的帮助!我发现这是一个dns问题而且是因为防火墙。在搜索了一些之后我发现了一个我在搜索'docker apt-get fail'时无法找到的问题
Docker - Network calls fail during image build on corporate network
他的问题与我的问题类似,解决方案帮助我解决了问题。我已经为将来发现这个问题的人复制了他的解决方案。
我们的防火墙后面无法访问这些Google服务器,这就是我们无法解析任何网址的原因。
解决方法是告诉Docker使用哪些DNS服务器。此修复程序取决于您如何安装Docker:Ubuntu Package
如果安装了Ubuntu软件包,请编辑/ etc / default / docker并添加以下行:
DOCKER_OPTS =“ - dns <your_dns_server_1> --dns <your_dns_server_2>”
您可以根据需要为此配置添加任意数量的DNS服务器。编辑完此文件后,您将需要重新启动Docker服务:
sudo服务码头重启
二进制
如果你已经通过二进制方法安装了Docker(即没有包),那么在启动Docker守护进程时设置DNS服务器:
sudo docker -d -D --dns --dns&
如果您看到像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
错误,那么您有两个选择:
/etc/resolv.conf
。这有点棘手,但它是动态生成的,并且您不会对DNS服务器进行硬编码。1.在docker daemon.json中硬编码DNS服务器
/etc/docker/daemon.json
{
"dns": ["10.1.2.3", "8.8.8.8"]
}
sudo systemctl restart docker
/etc/resolv.conf
中的值填充daemon.json
。2.修复主机的/etc/resolv.conf
A. Ubuntu 16.04及更早版本
/etc/resolv.conf
由NetworkManager动态生成。dns=dnsmasq
:
#
/etc/NetworkManager/NetworkManager.conf
B. Ubuntu 18.04及更高版本
/etc/resolv.conf
。现在默认情况下它使用本地DNS缓存127.0.0.53。这在集装箱内不起作用,因此Docker将默认使用Google的8.8.8.8 DNS服务器,这可能会破坏防火墙后面的人。sudo systemctl restart network-manager
实际上是一个符号链接(cat /etc/resolv.conf
),在Ubuntu 18.04中默认指向systemd-resolved
to generate /etc/resolv.conf
(127.0.0.53)。/etc/resolv.conf
,其中列出了真正的DNS服务器:
ls -l /etc/resolv.conf
/run/systemd/resolve/stub-resolv.conf
现在你应该在主机上有一个有效的/run/systemd/resolve/resolv.conf
,以便将docker复制到容器中。
首先检查你是否有连接,直接ping到sudo ln -sf /run/systemd/resolve/resolv.conf /etc/resolv.conf
指向的ip cat /etc/resolv.conf
:
/etc/resolv.conf
如果你仍然无法访问主机,那不是dns问题。
此外,如果你有互联网连接,你可以做一个黑客。只需在91.189.92.201
文件中添加一行并解决问题:
archive.ubuntu.com
我在两个不同的情况下遇到了这个问题,而且决议是不同的......
第一个使用Win7 + virtualbox(Xubuntu 16.04)此评论完成了这项工作:ping 91.189.92.201
我修改文件/ 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 OS上的第二个(ubuntu 16.04)先前的解决方案还不够。这个评论完成了这项工作:/etc/hosts
我必须在文件/etc/NetworkManager/NetworkManager.conf中注释一行:
dns=dnsmasq
然后跑
sudo重启网络管理员
我正在使用Mint的版本并在安装Docker并尝试创建Ubuntu的映像以执行apt-get update命令无法识别,为了解决问题,我确实下台了
91.189.92.201 archive.ubuntu.com
https://stackoverflow.com/a/29659783/2260796我遇到了与https://github.com/docker/docker/issues/1809相同的问题。我通过在Dockerfile中添加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
条目来解决这个问题。