有人可以帮助我在我的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两台服务器,所以我很确定防火墙不只是丢弃我的数据包。
对此有任何帮助将不胜感激!
谢谢!
答案 0 :(得分:26)
感谢您的帮助!我发现这是一个dns问题而且是因为防火墙。在搜索了一些之后,我发现了一个在搜索“docker apt-get fail”时无法找到的问题
Docker - Network calls fail during image build on corporate network
他的问题与我的问题相似,解决方案帮助我解决了问题。 我已经为将来发现这个问题的人复制了他的解决方案。
我们的防火墙后面无法访问这些Google服务器,这就是我们无法解析任何网址的原因。
解决方法是告诉Docker使用哪些DNS服务器。此修复程序取决于您安装Docker的方式: Ubuntu包
如果您安装了Ubuntu软件包,请编辑/ etc / default / docker并添加以下行:
DOCKER_OPTS =“ - dns< your_dns_server_1> --dns< your_dns_server_2>”
您可以根据需要为此配置添加任意数量的DNS服务器。编辑完此文件后,您将需要重新启动Docker服务:
sudo service docker restart
二进制文件
如果你已经通过二进制方法安装了Docker(即没有包),那么在启动Docker守护进程时设置DNS服务器:
sudo docker -d -D --dns --dns&
答案 1 :(得分:9)
如果看到类似Could not resolve ...
的错误,则可能是DNS配置。
要检查的第一件事是在 docker容器中运行cat /etc/resolv.conf
。如果它具有无效的DNS服务器,例如nameserver 127.0.x.x
,则容器将无法将域名解析为IP地址,因此ping google.com
将失败。
要检查的第二件事是在{strong>主机上运行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
现在,当您运行/启动容器时,docker将使用/etc/resolv.conf
中的值填充daemon.json
。
2。修复主机的/etc/resolv.conf
A。 Ubuntu 16.04和更低版本
对于Ubuntu 16.04和更低版本,/etc/resolv.conf
由NetworkManager动态生成。
在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
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复制到容器中。
答案 2 :(得分:4)
首先检查您是否有连接,直接ping到指向91.189.92.201
的ip archive.ubuntu.com
:
ping 91.189.92.201
如果您仍然无法访问主机,那么这不是dns问题。
此外,如果您有互联网连接,您可以进行黑客攻击。只需在/etc/hosts
文件中添加一行并解决问题:
91.189.92.201 archive.ubuntu.com
答案 3 :(得分:2)
我在两种不同的情况下遇到了这个问题,而且分辨率也不同......
第一个使用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 OS上的第二个(ubuntu 16.04) 先前的决议还不够。 这条评论完成了这项工作:https://github.com/docker/docker/issues/1809 我必须在文件/etc/NetworkManager/NetworkManager.conf中注释一行:
DNS =的dnsmasq
然后运行
sudo restart network-manager
答案 4 :(得分:1)
我正在使用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
答案 5 :(得分:0)
答案 6 :(得分:0)
我一直在使用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
答案 7 :(得分:0)
$ 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
可选-如果您不希望每次都在docker
前面加上sudo
前缀:
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.
Voilà!没错!
参考文献:
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