http://knktc.com/2014/08/16/docker-use-dnsmasq-as-hosts/


Docker使用dnsmasq替代/etc/hosts解析

docker目前没有办法直接修改容器中的/etc/hosts文件,如果要修改就会报出权限不足的警告,对此引发了很多的讨论。目前来看,要想彻底解决这个问题,只有等官方未来的解决方案了,但是目前我们可以用dnsmasq来解决本地的解析问题。

以下示例在centos6的容器中来进行:

1. 安装dnsmasq

yum install dnsmasq

如果想要docker启动后dnsmasq自动启动,安装完成后可以将启动命令加入到/.bashrc文件中

echo “service dnsmasq start &>/dev/null “ >> /.bashrc

2. 配置dnsmasq

修改/etc/dnsmasq.conf文件:

vi /etc/dnsmasq.conf

添加以下两行:

listen-address=127.0.0.1
addn-hosts=/etc/dnsmasq.hosts

以上两行配置指定了dnsmasq监听本地的请求,并且使用/etc/dnsmasq.hosts文件作为附加的解析文件

3. 添加需要解析的域名

创建或修改文件/etc/dnsmasq.hosts,加入需要进行解析的域名,格式与hosts文件格式相同

4. 退出容器并保存容器的修改

5. 启动容器

在启动容器的时候,需要使用以下的命令,附加—dns参数来指定使用本地的dnsmasq进行解析,同时还要指定第二个dns服务器用于解析其他的域名:

docker run -t -i —dns=127.0.0.1 —dns=114.114.114.114 knktc/centos6 /bin/bash

此时在容器就可以使用本地设定的域名解析了,效果和使用hosts文件一样。

已知问题:

dnsmasq启动需要一定的时间,如果使用docker run命令直接指定容器启动后启动程序,则会出现部分解析失败的问题,此时需要在启动命令中加入一些sleep时间,例如

docker run -t -i —dns=127.0.0.1 —dns=114.114.114.114 knktc/centos6 /bin/bash -ic “sleep 5;python myapp.py”