所有外部DNS查询都在docker容器中失败

时间:2017-02-14 10:50:12

标签: docker dns docker-swarm

当前泊坞窗版本:<body> <div class="container-fluid"> <div class="row"> <div class="col-lg-2 col-md-2 col-sm-2 col-xs-2" id="leftMenu"> </div> <div class="col-lg-8 col-md-8 col-sm-8 col-xs-8"> <div class="row" id="viewport"> </div> <div class="row" id="informationMenu"> </div> </div> <div class="col-lg-2 col-md-2 col-sm-2 col-xs-2" id="rightMenu"> </div> </div> </div> <script type="text/javascript"> $(document).ready(function(){ var controller = new Controller('viewport'); }); </script> </body>

/etc/resolv.conf的内容:

1.13.1, build 092cba3

(真实公司名称混淆)。

主机本身的

search mycompany.local nameserver 127.0.0.11 options ndots:0 100%正常,但是从容器内部看,任何外部主机名看起来都失败了(不能运行事件nslookup)。 在4节点集群中的所有主机中都存在相同的症状。 请注意,内部服务名称解析似乎在容器之间起作用。

直接在我的笔记本电脑上运行相同的应用程序(在同一办公室网络上)主机名解析正常。

这正在成为一个缓慢发生的灾难。

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

2 个答案:

答案 0 :(得分:0)

在Linux中,lo或localhost接口的地址为127.0.0.1/8(即网络掩码255.0.0.0)。该网络掩码涵盖了整个范围:

127.0.0.0 - 127.255.255.255

由于127.0.0.11属于此范围,因此与该地址的连接将尝试通过lo接口(容器内)作为连接路由进行路由。除非您的容器具有内部配置的并且具有侦听该地址的DNS解析器,否则将导致连接超时。

您可以通过将127.0.0.11路由到容器的主界面(例如eth0)或更改DNS解析程序地址以使其超出127.0.0.0/8来解决此问题。 p>

您还可以明确设置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 :(得分:0)

这是我使用的设置:

  1. 安装dnsmasq。
  2. 运行echo interface=docker0 > /etc/dnsmasq.d/docker
  3. 重新启动dnsmasq。
  4. - dns 172.17.0.1 添加到docker-run或Docker守护程序(将其添加到/ strong中的 DOCKER_OPTS 变量中etc / default / docker或编辑/lib/systemd/system/docker.service中的 ExecStart 指令。
  5. 重启Docker。
  6. 现在您将所有容器指向Dnsmasq作为DNS解析器。另一个好处是,在/ etc / hosts中的条目也会得到解决。