我在Docker容器中有未绑定(bind)的DNS服务器。该容器在docker守护进程中具有以下端口映射:
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服务器。关键是,他们没有。

实际发生的情况是这样的:
Whithin是一个随机容器,我可以ping主机的地址以及未绑定(bind)容器的地址。但是,当我在容器中使用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在容器中根本不起作用。

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

最佳答案

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

要至少以以下方式解决此问题:

  • 如果可能,将容器IP(DNS容器)用作DNS解析器。

  • 要么
  • 向您的DNS服务器容器提供--net=host,并完全删除端口映射。然后,主机IP DNS将按预期工作。
  • 关于docker - Docker容器中的DNS服务器,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/39937496/

    10-15 13:16
    查看更多