我在 ubuntu 16 上:
我有一台运行带有 Bind9 的 docker 容器的服务器,它作为我的网络 DNS 服务器192.168.3.70
。我网络中的所有主机都使用它作为 DNS,它运行良好。
该主机上还有另一个运行 Jenkins 的容器,DNS 不起作用。
这是我尝试过的/etc/init.d/docker:
# modify these in /etc/default/$BASE (/etc/default/docker)
DOCKER=/usr/bin/$BASE
# This is the pid file managed by docker itself
DOCKER_PIDFILE=/var/run/$BASE.pid
# This is the pid file created/managed by start-stop-daemon
DOCKER_SSD_PIDFILE=/var/run/$BASE-ssd.pid
DOCKER_LOGFILE=/var/log/$BASE.log
DOCKER_OPTS="--dns 192.168.3.70 --dns 8.8.8.8"
DOCKER_DESC="Docker"
这不起作用,Jenkins 仍然没有 DNS。
当然,我已经重新启动了守护进程,但没有任何变化。
怎么了?
编辑
因此,我运行docker exec -i -t d...... /bin/bash
并获取了一个 bash shell。
cat /etc/resolv.conf
# Dynamic resolv.conf(5) file for glibc resolver(3) generated by resolvconf(8)
# DO NOT EDIT THIS FILE BY HAND -- YOUR CHANGES WILL BE OVERWRITTEN
nameserver 192.168.3.70
search olympus
这是正确的 DNS 服务器,我可以ping 192.168.3.70
jenkins@d76b1da9544d:/$ ping 192.168.3.70
PING 192.168.3.70 (192.168.3.70): 56 data bytes
64 bytes from 192.168.3.70: icmp_seq=0 ttl=64 time=0.094 ms
64 bytes from 192.168.3.70: icmp_seq=1 ttl=64 time=0.073 ms
仍然没有 DNS。
答案1
Docker 正在将网络完全抽象化,变成一个非常复杂、错综复杂的整体。
我相信它已配置为将来自其他计算机的 DNS 连接重定向到 DNS 容器。而来自盒子本身的 DNS 连接不会被 Docker 拦截。
这是一个常见问题。Docker 运行服务,而您则需要自己将它们连接在一起。
正确的解决方法是深入分析网络配置,然后重新配置网络配置,使服务能够通信。但是,这非常复杂,我们可能都不具备这方面的资格,而且 stackoverflow 也不适合运行长时间的调试会话。
因此我们必须采用一个简单的解决方法:
在常规服务器上正常运行 DNS 服务器,不要将它们 docker 化。DNS 服务在基础设施中至关重要。为此而配备小型服务器/虚拟机是很常见的。