所有外部DNS查询都在Docker容器内失败

当前docker版本: 1.13.1, build 092cba3

/etc/resolv.conf的内容:

 search mycompany.local nameserver 127.0.0.11 options ndots:0 

(真实的公司名称混淆)。

主机上的nslookup本身是100%的,但是从容器内的任何外部主机名看起来都失败(不能事件运行apt-get update )。 4节点群集中的所有主机都会出现相同的症状。 请注意内部服务名称parsing似乎在容器之间工作。

直接在我的笔记本电脑上运行相同的应用程序(在同一办公室networking)主机名解决好。

这正在变成一个缓慢移动的灾难。

涉及的集群仍然是1.12版本之前的版本,可能会有任何影响。

在Linux中, lo或localhost接口的地址是127.0.0.1/8(即networking掩码255.0.0.0)。 networking掩码覆盖了整个范围:

 127.0.0.0 - 127.255.255.255 

由于127.0.0.11属于这个范围,到那个地址的连接将尝试通过lo接口(容器内部 )作为连接路由进行路由。 除非您的容器具有内部configuration的地址, 并且有一个DNSparsing器监听该地址,否则将导致连接超时。

您可以通过将127.0.0.11路由到容器的主界面(例如eth0 )或通过更改DNSparsing器地址来解决此问题,使其位于127.0.0.0/8之外。

您也可以明确地设置DNS服务器IP。

 docker run --dns 1.2.3.4 # set one server docker run --dns 1.2.3.4 --dns 5.6.7.8 # set multiple servers 

或者使用docker-compose.yml:

 dns: 1.2.3.4 dns: - 1.2.3.4 - 5.6.7.8 

这是我使用的设置:

  1. 安装dnsmasq。
  2. 运行echo interface=docker0 > /etc/dnsmasq.d/docker
  3. 重新启动dnsmasq。
  4. –dns 172.17.0.1添加到docker -run或Docker守护进程(将其添加到/ etc / default / docker中的DOCKER_OPTSvariables或编辑/lib/systemd/system/docker.service中的ExecStart伪指令)。
  5. 重新启动Docker。

现在,您已将所有容器指向Dnsmasq作为DNSparsing器。 另外一个好处就是在/ etc / hosts中的条目也被parsing了。