Docker容器中的DNS服务器

时间:2016-10-08 21:19:21

标签: docker dns

我在Docker容器中有DNS服务器Unbound。此容器在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服务器。这在我的本地网络上运行良好。 主机本身通过IP 192.168.24.5使用此DNS服务器。这是发给主机/etc/resolv.conf的地址。 (我知道如果有127.0.0.1作为名称服务器地址,它将不适用于docker。)

我有一些其他的docker容器,他们也应该使用这个DNS服务器。关键是,他们不是。

实际发生的是: 在随机容器中,我可以ping主机的地址以及未绑定容器的地址。但是当我在容器内使用dig时,我得到了这些结果:

# 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在容器中根本不起作用。

我做错了还是码头做了不该做的事情?

1 个答案:

答案 0 :(得分:2)

问题是DNS服务器的iptables UDP nat。您正在查询主机IP,而它是docker bridge网络的响应。

至少要解决这个问题:

  • 如果可能,请使用容器IP(DNS容器)作为DNS解析程序。

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