Docker容器中的DNS服务器

我有一个泊坞窗容器中的DNS服务器解除绑定。 该容器在docker deamon中具有以下端口映射:0.0.0.0:53->53/tcp,0.0.0.0:53->53/udp

docker主机的IP地址为192.168.24.5,本地DHCP服务器将主机的IP作为本地DNS服务器。 这工作正常我的本地networking。 主机本身通过IP 192.168.24.5使用这个DNS服务器。 这是放在主机的/etc/resolv.conf中的地址。 (我知道,如果有127.0.0.1作为域名服务器地址,它将不能用于docker。)

我有一些其他docker集装箱,他们也应该使用这个DNS服务器。 问题是,他们没有。

实际情况是这样的:在一个随机容器中,我可以ping主机地址以及未绑定容器的地址。 但是当我在一个容器中使用挖掘,我得到这些结果:

# dig @172.17.0.6 ... ;; Got answer: ;; ->>HEADER<<- opcode: QUERY, status: REFUSED, id: 22778 ;; flags: qr rd ad; QUERY: 0, ANSWER: 0, AUTHORITY: 0, ADDITIONAL: 0 ;; WARNING: recursion requested but not available

# dig @192.168.24.5 ... ;; reply from unexpected source: 172.17.0.1#53, expected 192.168.24.5#53

这看起来像一些内部的DNS服务器拦截查询,并试图回答他们。 如果使用主机的DNS服务器来获得答案,那就没有问题,但事实并非如此。 DNS在容器中根本不起作用。

我做错了吗,还是docker工做了不应该做的事?

问题是iptables UDP nat的DNS服务器。 您正在查询主机IP,同时也是docker桥networking的响应。

至less要解决这个问题的方法:

  • 如果可能,请使用容器IP(DNS容器)作为DNSparsing器。

要么

  • 提供--net=host到您的DNS服务器容器,并完全删除端口映射。 然后,主机IP DNS将按预期工作。