设置Docker Dnsmasq
我试图build立一个dockerdnsmasq容器,以便我可以让所有的docker容器查找域名而不是硬编码的IP(如果它们在同一个主机上)。 这解决了一个问题,那就是不能改变docker容器中的/ etc / hosts文件 ,这允许我通过改变dnsmasq容器引用的单个文件来一次性更新所有的容器。
看起来有人已经为我做了艰苦的工作,并创build了一个dnsmasq容器 。 不幸的是,这不是“为我工作”。 我写了一个bash脚本来启动容器,如下所示:
name="dnsmasq_" timenow=$(date +%s) name="$name$timenow" sudo docker run \ -v="$(pwd)/dnsmasq.hosts:/dnsmasq.hosts" \ --name=$name \ -p='127.0.0.1:53:5353/udp' \ -d sroegner/dnsmasq
在运行之前,我创build了dnsmasq.hosts目录,并在其中插入了一个名为hosts.txt的文件,内容如下:
192.168.1.3 database.mydomain.com
不幸的是,每当我尝试从内部ping该域名:
- 主人
- dnsmasq容器
- 另一个容器在同一台主机上
我总是收到ping: unknown host
错误信息。
我尝试启动dnsmasq容器没有守护进程模式,所以我可以debugging它的输出,这是在下面:
dnsmasq: started, version 2.59 cachesize 150 dnsmasq: compile time options: IPv6 GNU-getopt DBus i18n DHCP TFTP conntrack IDN dnsmasq: reading /etc/resolv.dnsmasq.conf dnsmasq: using nameserver 8.8.8.8#53 dnsmasq: read /etc/hosts - 7 addresses dnsmasq: read /dnsmasq.hosts//hosts.txt - 1 addresses
我猜测,我没有正确指定-p
参数启动容器时。 有人能告诉我应该为其他docker集装箱查找DNS,或者我想要做的事实际上是不可能的吗?
docker dnsmasq服务的构build脚本需要改变,以绑定到您的服务器的公共IP ,在我的eth0接口(在本例中为192.168.1.12)
#!/bin/bash NIC="eth0" name="dnsmasq_" timenow=$(date +%s) name="$name$timenow" MY_IP=$(ifconfig $NIC | grep 'inet addr:'| grep -v '127.0.0.1' | cut -d: -f2 | awk '{ print $1}') sudo docker run \ -v="$(pwd)/dnsmasq.hosts:/dnsmasq.hosts" \ --name=$name \ -p=$MY_IP:53:5353/udp \ -d sroegner/dnsmasq
在主机上(在本例中为Ubuntu 12),需要更新resolv.conf或/ etc / network / interfaces文件,以便将公共IP(eth0或eth1设备)注册为域名服务器。
您可能希望设置一个辅助的名称服务器为谷歌每当容器不运行,通过将行更改为dns-nameservers xxx.xxx.xxx.xxx 8.8.8.8
例如,没有逗号或其他行。
然后,如果更新了/ etc / network / interfaces文件,则需要重新启动networking服务sudo /etc/init.d/networking restart
,以便此自动更新docker将复制到容器期间的/etc/resolve.conf文件构build。
现在重新启动所有的容器
-
sudo docker stop $CONTAINER_ID
-
sudo docker start $CONTAINER_ID
这会导致其/etc/resolv.conf文件更新,因此它们指向新的名称服务器设置。
所有泊坞窗容器中的DNS查找(您自做出更改后构build的)现在应该可以使用您的dnsmasq容器了!
顺便说一下,这意味着只要其主机的域名服务器设置设置为使用此服务器的公有IP ,其他主机上的泊坞窗容器也可以利用此主机上的dnsmasq服务。