设置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服务。