我在 Ubuntu 14.04 LTS 上遇到了我的 Docker 容器的问题。Docker 工作了两天,然后突然我失去了容器内的所有网络连接。下面的错误输出最初让我相信这是因为 apt-get 试图通过 IPv6 解析 DNS。
我在我的主机上禁用了 IPv6,但仍然删除了所有图像,提取了基础 ubuntu,但仍然遇到了问题。
我将 /etc/resolve.conf 名称服务器从本地 DNS 服务器更改为 Google 的公共 DNS 服务器(8.8.8.8 和 8.8.4.4),但仍然没有运气。我还在 /etc/default/docker 的 DOCKER_OPTS 中将 DNS 设置为 Google 并重新启动了 docker。
我也试过拉coreos,yum也无法解析DNS。
这很奇怪,因为虽然 DNS 不起作用,但当我 ping apt-get 无法解析的相同更新服务器时,我仍然得到响应。
我不在代理后面,我在一个非常标准的本地网络上,这个版本的 Ubuntu 是最新的和新鲜的(我两天前安装了更接近 docker)。
我已经通过关于 stackoverflow 和 github 问题的其他帖子彻底研究了这一点,但没有找到任何解决方案。我不知道如何解决这个问题,有人可以帮忙吗?
错误信息
➜ arthouse git:(docker) ✗ docker build --no-cache .
Sending build context to Docker daemon 51.03 MB
Sending build context to Docker daemon
Step 0 : FROM ubuntu:14.04
---> 5506de2b643b
Step 1 : RUN apt-get update
---> Running in 845ae6abd1e0
Err http://archive.ubuntu.com trusty InRelease
Err http://archive.ubuntu.com trusty-updates InRelease
Err http://archive.ubuntu.com trusty-security InRelease
Err http://archive.ubuntu.com trusty-proposed InRelease
Err http://archive.ubuntu.com trusty Release.gpg
Cannot initiate the connection to archive.ubuntu.com:80 (2001:67c:1360:8c01::19). - connect (101: Network is unreachable) [IP: 2001:67c:1360:8c01::19 80]
Err http://archive.ubuntu.com trusty-updates Release.gpg
Cannot initiate the connection to archive.ubuntu.com:80 (2001:67c:1360:8c01::19). - connect (101: Network is unreachable) [IP: 2001:67c:1360:8c01::19 80]
Err http://archive.ubuntu.com trusty-security Release.gpg
Cannot initiate the connection to archive.ubuntu.com:80 (2001:67c:1360:8c01::19). - connect (101: Network is unreachable) [IP: 2001:67c:1360:8c01::19 80]
Err http://archive.ubuntu.com trusty-proposed Release.gpg
Cannot initiate the connection to archive.ubuntu.com:80 (2001:67c:1360:8c01::19). - connect (101: Network is unreachable) [IP: 2001:67c:1360:8c01::19 80]
Reading package lists...
W: Failed to fetch http://archive.ubuntu.com/ubuntu/dists/trusty/InRelease
W: Failed to fetch http://archive.ubuntu.com/ubuntu/dists/trusty-updates/InRelease
W: Failed to fetch http://archive.ubuntu.com/ubuntu/dists/trusty-security/InRelease
W: Failed to fetch http://archive.ubuntu.com/ubuntu/dists/trusty-proposed/InRelease
W: Failed to fetch http://archive.ubuntu.com/ubuntu/dists/trusty/Release.gpg Cannot initiate the connection to archive.ubuntu.com:80 (2001:67c:1360:8c01::19). - connect (101: Network is unreachable) [IP: 2001:67c:1360:8c01::19 80]
W: Failed to fetch http://archive.ubuntu.com/ubuntu/dists/trusty-updates/Release.gpg Cannot initiate the connection to archive.ubuntu.com:80 (2001:67c:1360:8c01::19). - connect (101: Network is unreachable) [IP: 2001:67c:1360:8c01::19 80]
W: Failed to fetch http://archive.ubuntu.com/ubuntu/dists/trusty-security/Release.gpg Cannot initiate the connection to archive.ubuntu.com:80 (2001:67c:1360:8c01::19). - connect (101: Network is unreachable) [IP: 2001:67c:1360:8c01::19 80]
W: Failed to fetch http://archive.ubuntu.com/ubuntu/dists/trusty-proposed/Release.gpg Cannot initiate the connection to archive.ubuntu.com:80 (2001:67c:1360:8c01::19). - connect (101: Network is unreachable) [IP: 2001:67c:1360:8c01::19 80]
W: Some index files failed to download. They have been ignored, or old ones used instead.
容器 IFCONFIG/PING
➜ code docker run -it ubuntu /bin/bash
root@7bc182bf87bb:/# ifconfig
eth0 Link encap:Ethernet HWaddr 02:42:ac:11:00:04
inet addr:172.17.0.4 Bcast:0.0.0.0 Mask:255.255.0.0
inet6 addr: fe80::42:acff:fe11:4/64 Scope:Link
UP BROADCAST RUNNING MTU:1500 Metric:1
RX packets:7 errors:0 dropped:0 overruns:0 frame:0
TX packets:8 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:738 (738.0 B) TX bytes:648 (648.0 B)
lo Link encap:Local Loopback
inet addr:127.0.0.1 Mask:255.0.0.0
inet6 addr: ::1/128 Scope:Host
UP LOOPBACK RUNNING MTU:65536 Metric:1
RX packets:0 errors:0 dropped:0 overruns:0 frame:0
TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:0
RX bytes:0 (0.0 B) TX bytes:0 (0.0 B)
root@7bc182bf87bb:/# ping google.com
PING google.com (74.125.226.0) 56(84) bytes of data.
64 bytes from lga15s42-in-f0.1e100.net (74.125.226.0): icmp_seq=1 ttl=56 time=12.3 ms
--- google.com ping statistics ---
1 packets transmitted, 1 received, 0% packet loss, time 0ms
rtt min/avg/max/mdev = 12.367/12.367/12.367/0.000 ms
root@7bc182bf87bb:/# ping 8.8.8.8
PING 8.8.8.8 (8.8.8.8) 56(84) bytes of data.
64 bytes from 8.8.8.8: icmp_seq=1 ttl=44 time=21.8 ms
64 bytes from 8.8.8.8: icmp_seq=2 ttl=44 time=21.7 ms
64 bytes from 8.8.8.8: icmp_seq=3 ttl=44 time=21.7 ms
此外,当我强制 IPv4 时,apt-get update 失败:
root@6d925cdf84ad:/# sudo apt-get update -o Acquire::ForceIPv4=true
Err http://archive.ubuntu.com trusty InRelease
Err http://archive.ubuntu.com trusty-updates InRelease
Err http://archive.ubuntu.com trusty-security InRelease
Err http://archive.ubuntu.com trusty-proposed InRelease
Err http://archive.ubuntu.com trusty Release.gpg
Unable to connect to archive.ubuntu.com:http: [IP: 91.189.88.153 80]
Err http://archive.ubuntu.com trusty-updates Release.gpg
Unable to connect to archive.ubuntu.com:http: [IP: 91.189.88.153 80]
Err http://archive.ubuntu.com trusty-security Release.gpg
Unable to connect to archive.ubuntu.com:http: [IP: 91.189.88.153 80]
Err http://archive.ubuntu.com trusty-proposed Release.gpg
Unable to connect to archive.ubuntu.com:http: [IP: 91.189.88.153 80]
Reading package lists... Done
W: Failed to fetch http://archive.ubuntu.com/ubuntu/dists/trusty/InRelease
哇,我在 github 上找到了一个帖子,解决了我的问题。
在 Steve K. 指出这实际上不是 DNS 问题而是连接问题之后,我能够在 github 上找到一篇描述如何解决此问题的帖子。
显然 docker0 网桥被挂了。安装 bridge-utils 并运行以下命令使我的 Docker 正常工作:
如果是 DNS 解析器问题,解决方法如下:
首先要检查的是
cat /etc/resolv.conf
在docker 容器中运行。如果它有一个无效的 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
错误,那么您有 2 个选择:在 daemon.json 中硬编码 DNS 服务器。如果您希望 DNS 服务器发生变化,这很容易,但并不理想。
修复主机的
/etc/resolv.conf
. 这有点棘手,但它是动态生成的,并且您没有对 DNS 服务器进行硬编码。1. docker daemon.json 中硬编码 DNS 服务器
编辑
/etc/docker/daemon.json
重新启动 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
生成/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 复制到容器中。试图为我也遇到的问题增加额外的价值;有一个替代答案:
我的网络与办公室相关,并且 Google DNS 设置被阻止,因此容器可以 ping IP 地址但不能 ping 域名。
我的主人
/etc/resolv.conf
原本的样子;这是由于网络管理器对 DNS 服务器详细信息进行了某种屏蔽。
不幸的是,根据docker 手册, docker 在构建容器的 resolv.conf 时会过滤掉任何 localhost IP 地址,并将其替换为 Google 的 DNS IP。在我的情况下,这导致域名被禁止使用。
我不得不:
/etc/default/docker
为默认值,以便容器使用我主机的 resolv.conf 内容。/etc/NetworkManager/NetworManager.conf
并注释掉该行dns=dnsmasq
。这样 NM 可以指定实际的 DNS IP 地址而不是 127.0.0.1。sudo service network-manager restart
。sudo service docker restart
。例如,运行一个容器将允许它执行
apt-get update/upgrade
。Docker 官方文档提供了配置 DNS 服务器以供 Docker 使用的工具
打开
/etc/default/docker
文件进行编辑:为 Docker 添加设置:
替换
8.8.8.8
为本地 DNS 服务器,例如192.168.1.1
. 您还可以指定多个 DNS 服务器。用空格分隔它们,例如:警告:如果您在连接到各种网络的笔记本电脑上执行此操作,请确保选择公共 DNS 服务器。
PS:
nm-tool
可以用来查看本地主机DNS服务器保存并关闭文件。
重新启动 Docker 守护程序。
你的错误在这里:
这不是 DNS 的错误,而是您的系统正在尝试连接到 IPv6 主机并失败。大概是因为您的主机上没有 IPv6 访问权限。IPv6 地址的实际查找成功。(ubuntu 镜像/存档可在 IPv6 和 IPv4 上使用。您只是不幸遇到了 IPv6,因为您的系统认为它应该可以工作。)
您应该通过安装 miredo来解决这个问题,或者重试直到您遇到 IPv4 镜像。
在这里要再次认识到的重要一点是 DNS 不是罪魁祸首,正如您可以通过自己的 ping 测试看到的那样。
对于在使用 boot2docker 时来到这里的其他读者,这是我修复的方法。事实上,上面的答案为我指明了正确的方向。
基本上,由于某种原因,boot2docker 中的容器无法解析主机名。
所以我只是重新启动了 boot2docker 并启动了容器。现在主机名可以再次正确解析。
我想问题是在连接主机上的网络时启动 boot2docker,这导致 boot2docker 启动并进入非工作状态。
当我允许 Ubuntu 安装程序安装 Docker snap 包时,我遇到了这个问题。当我放弃它并切换到官方 Docker 包时,问题自行解决了。
我在 Windows 上遇到了同样的问题。这个命令让它为我工作:
docker-machine restart
有一个类似的问题,但在用户定义的网络中的容器之间的名称解析似乎有点不稳定。有些人无法解决像你这样的问题。
问题是移动的 /var/lib/docker。由于空间原因,它是通过 nfs 安装的。添加本地文件系统并将文件移动到那里可以解决问题。
重启 Debian9 上的 Docker 守护进程
service docker restart
连接和网络工作正常