当前位置: 首页>>技术教程>>正文


Docker容器无法在Ubuntu 14.04 Desktop Host上解析DNS

, , , ,

问题描述

我在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无法正常工作,但是当我对apt-get无法解析的更新服务器执行ping操作时,仍然会收到响应。

我没有代理服务器,我使用的是非常标准的本地网络,并且此版本的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更新失败:

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  

最佳回答

oo,我在github上找到了解决我问题的文章。

在Steve K.指出这实际上不是DNS问题,而是连接问题之后,我能够找到描述如何解决此问题的a post on github

显然docker0网桥已挂起。安装bridge-utils并运行以下命令可使我的Docker正常工作:

apt-get install bridge-utils
pkill docker
iptables -t nat -F
ifconfig docker0 down
brctl delbr docker0
service docker restart

次佳回答

如果是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服务器进行更改,则不理想。

  2. 修复主机的/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将使用daemon.json中的值填充/etc/resolv.conf


2.修复主机的/etc/resolv.conf

A.Ubuntu 16.04及更早版本

  • 对于Ubuntu 16.04及更早版本,/etc/resolv.conf由NetworkManager动态生成。

  • 注释掉/etc/NetworkManager/NetworkManager.conf中的dns=dnsmasq行(带有#)

  • 重新启动NetworkManager以重新生成/etc/resolv.confsudo 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最初看起来像;

#Dynamic resolv.conf(5) file for glibc resolver(3) generated by resolvconf(8)
#DO NOT EDIT THIS FILE BY HAND -- YOUR CHANGES WILL BE OVERWRITTEN
nameserver 127.0.1.1
search companyDomain.co.za

这是由于网络管理器对DNS服务器详细信息进行了某种形式的屏蔽。

不幸的是,根据docker manuals的说法,泊坞窗在构建容器的resolv.conf时会过滤出所有本地IP地址,并将其替换为Google的DNS IP。在我的情况下,这导致域名为off-limits。

我不得不:

  • 将我的/etc/default/docker重置为默认值,以便容器改为使用主机的resolv.conf内容。

  • 编辑/etc/NetworkManager/NetworManager.conf并注释掉dns=dnsmasq行。这样,NM可以指定实际的DNS IP地址,而不是127.0.0.1。

  • 使用sudo service network-manager restart重新启动NM。

  • 使用sudo service docker restart重新启动docker服务。

例如,运行一个容器将允许它执行apt-get update/upgrade

第四种回答

您的错误在这里:

 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]

这不是DNS错误,而是您的系统正在尝试连接到IPv6主机而失败。大概是因为您的主机上没有IPv6访问权限。 IPv6地址的实际查找成功。 (ubuntu镜像/存档可同时在IPv6和IPv4上使用。由于系统认为它应该可以工作,因此您不幸地遇到了IPv6)。

您应该通过installing miredo修复此问题,或者重试直到命中IPv4镜像。

再次要意识到的重要一点是,DNS不应该受到指责,正如您通过自己的ping测试所看到的那样。

第五种回答

Docker official doc提供了配置DNS服务器以供Docker使用的工具

  1. 打开/etc/default/docker文件进行编辑:

    sudo nano /etc/default/docker
    
  2. 为Docker添加一个设置:

    DOCKER_OPTS="--dns 8.8.8.8"
    
  3. 8.8.8.8替换为本地DNS服务器,例如192.168.1.1。您还可以指定多个DNS服务器。用空格分隔它们,例如:

    --dns 8.8.8.8 --dns 192.168.1.1
    

    警告:如果要在连接到各种网络的笔记本电脑上进行此操作,请确保选择公共DNS服务器。

    PS:nm-tool可用于检查本地主机DNS服务器

  4. 保存并关闭文件。

  5. 重新启动Docker守护程序。

    sudo service docker restart
    

参考资料

本文由Ubuntu问答整理, 博文地址: https://ubuntuqa.com/article/11392.html,未经允许,请勿转载。