由于开发需要多台服务器使用域名解析,需要在内网搭建一套dns系统,原来搭建过基于bind的dns服务器,但是这种服务器的配置修改比较繁琐,因此想搭建一个轻量级的dns服务器。这里我使用了dnsmasq服务。

首先了解一下什么是dnsmasq,维基百科这样说明:

dns docker dns docker web ui_dnsmasq

这次的web-ui管理界面是基于go语言开发,下面让我们开始吧!

一、准备一台centos7的虚拟机服务器,最小安装即可,然后安装docker,这里关于docker的安装不再赘述;

二、在/home目录下编写Dockerfile文件

FROM alpine:edge
 LABEL maintainer="dev@jpillora.com"
 # webproc release settings
 ENV WEBPROC_VERSION 0.1.9
 ENV WEBPROC_URL https://github.com/jpillora/webproc/releases/download/$WEBPROC_VERSION/webproc_linux_amd64.gz
 # fetch dnsmasq and webproc binary
 RUN apk update \
         && apk --no-cache add dnsmasq \
         && apk add --no-cache --virtual .build-deps curl \
         && curl -sL $WEBPROC_URL | gzip -d - > /usr/local/bin/webproc \
         && chmod +x /usr/local/bin/webproc \
         && apk del .build-deps
 #configure dnsmasq
 run mkdir -p /etc/default/
 RUN echo -e "ENABLED=1\nIGNORE_RESOLVCONF=yes" > /etc/default/dnsmasq
 COPY dnsmasq.conf /etc/dnsmasq.conf
 ADD program.toml /etc/default.toml
 #run!
 ENTRYPOINT ["webproc","/etc/default.toml"]三、在Dockerfile文件目录下编写webui启动配置文件program.toml
 ProgramArgs = ["dnsmasq","--no-daemon"]
# Interface to serve web UI. Warning: defaults to ALL interfaces.
 Host = "0.0.0.0"# Port to serve web UI
 Port = 8080# 登录管理dns的用户名密码 web UI
 User = "dns"
 Pass = "dns"# 允许哪些ip地址范围访问webui,安全配置选项,全部清空表示不做任何限制
 # For example, ["10.0.0.0/8"]
 AllowedIPs = ["133.3.103.0/24","133.3.5.0/24"]Log = "both"
# OnExit dictates what action to take when the process exits:
 # "ignore" - ignore and wait for manual restart via the web UI
 # "proxy" - also exit webproc with the same exit code
 # "restart" - automatically restart with exponential backoff time delay between failed restarts
 OnExit = "restart"ConfigurationFiles = ["/etc/dnsmasq.conf"]
RestartTimeout = "30s"
四、在Dockerfile目录下配置dnsmasq执行时使用的配置文件
#dnsmasq config, for a complete example, see:
 #  http://oss.segetech.com/intra/srv/dnsmasq.conf
 #log all dns queries
 log-queries
 #dont use hosts nameservers
 no-resolv
 #use google as default nameservers
 server=133.0.160.15
 #server=8.8.8.8
 #serve all .company queries using a specific nameserver
 server=/zqkzzx/133.3.5.145
 #explicitly define host-ip mappings
 address=/freenas.zqkzzx.com/133.3.103.174
 address=/cloud.zqkzzx.com/133.3.103.193
 #serve all .xfvip queries using a specific nameserver
 server=/xfvip/133.3.5.145
 address=/nas.xfvip.com/133.3.103.174
 address=/cloud.xfvip.com/133.3.103.193
 address=/wok.xfvip.com/133.3.103.202
 #serve all .xfvip queries using a specific nameserver
 server=/xykz/133.3.5.145
 address=/master.xykz.com/192.168.1.100
 address=/node1.xykz.com/192.168.1.55
 address=/node2.xykz.com/192.168.1.208
 address=/nfs2.xykz.com/192.168.1.74五、docker编译镜像
docker build -t dnsmasq:v2 .

在dockerfile文件目录下应该有三个前面已经准备好的文件如下:

dns docker dns docker web ui_docker_02

具体编译过程如下

dns docker dns docker web ui_dnsmasq_03

六、查看编译好的镜像

docker images

我们可以发现有两个版本的dnsmasq,我们上面编译生成的v2版本

dns docker dns docker web ui_配置文件_04

七、执行镜像运行dnsmasq,开启dns服务与webui管理

      docker run \
     --name dnsmasq \
     -d \
     -p 53:53/udp \
     -p 5380:8080 \
     -v /home/wangli/dnsmasq/dnsmasq.conf:/etc/dnsmasq.conf \
     --restart always \
     dnsmasq:v2

容器内开启udp53端口提供dns服务,开启8080端口提供webui服务,在容器运行的主机上对外发布udp53端口与tcp5380端口,其中通过tcp5380端口完成webui的管理

dns docker dns docker web ui_docker_05

八、通过chrome浏览器登录docker宿主机5380端口配置dns

1、server下对于bind配置中的zone,也就是一个域

2、每个server下可以配置多个A记录,也就是address

3、dnsmasq可以支持同时配置多个域

dns docker dns docker web ui_dnsmasq_06

这个webui界面非常简洁明了,纵向分三列,最左边是控制台负责操作服务重启与日志开关,第二列是配置文件加载内容,由于在docker运行时我们把配置文件写在本地/home/wangli/dnsmasq/dnsmasq.conf,所以即使docker挂掉也可以保证数据不丢失,如果把配置文件写在nfs或其他网络共享磁盘上可以供多个dnsmasq服务使用。

最右边就是dnsmasq运行日志,通过最左边的控制台可以控制输出内容,默认全部输出。

九、在客户机上配置dns解析服务器地址为docker主机ip

dns docker dns docker web ui_bind_07

十、测试dns解析是否成功

dns docker dns docker web ui_bind_08

dns docker dns docker web ui_dns docker_09

dns docker dns docker web ui_bind_10

dnsmasq日志显示主机dns请求

十一、源码补充说明

dns docker dns docker web ui_配置文件_11

1、如果启动时定义了default.toml,则通过docker -e 选项导入的环境变量会被default.toml文件中定义的变量值覆盖;

2、port、http_user、http_pass这三个变量是可以通过docker -e 方式导入执行的,如果没有与default.toml冲突;

dns docker dns docker web ui_bind_12

如果配置了AllowedIPs选项,则没有在其中的ip地址访问webui时会被拒绝。具体如下:

dns docker dns docker web ui_bind_13