我在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在容器中根本不起作用。
我做错了还是码头做了不该做的事情?
答案 0 :(得分:2)
问题是DNS服务器的iptables UDP nat。您正在查询主机IP,而它是docker bridge网络的响应。
至少要解决这个问题:
或
--net=host
并完全删除端口映射。然后主机IP DNS将按预期工作。