最开始我是在MacOs系统上安装docker(下载地址),但是macOS无法直接访问docker容器的IP(官网上也有说明,有知道的朋友麻烦告知),最终在Centos7系统安装docker,我安装的是CE版本(下载及安装说明地址).

安装docker
最终在Centos7系统安装docker,我安装的是CE版本(下载及安装说明地址).
安装docker-compose
使用curl下载
将下载的文件权限修改为可执行权限
将docker-compose移入/usr/bin目录,以便在终端直接执行
具体参考官方安装文档
编写 dockerfile
Docker下载完成之后,编写dockerfile文件,下载centos7镜像,此处要注意,由于以后我们要使用systemctl,所以需要特殊处理,如下:
FROM centos:7
ENV container docker
RUN (cd /lib/systemd/system/sysinit.target.wants/; for i in *; do [ $i == \
systemd-tmpfiles-setup.service ] || rm -f $i; done); \
rm -f /lib/systemd/system/multi-user.target.wants/*;\
rm -f /etc/systemd/system/*.wants/*;\
rm -f /lib/systemd/system/local-fs.target.wants/*; \
rm -f /lib/systemd/system/sockets.target.wants/*udev*; \
rm -f /lib/systemd/system/sockets.target.wants/*initctl*; \
rm -f /lib/systemd/system/basic.target.wants/*;\
rm -f /lib/systemd/system/anaconda.target.wants/*;
VOLUME [ "/sys/fs/cgroup" ]
CMD ["/usr/sbin/init"]
具体情况请参考官方文档说明
DNS
我计划安装两台DNS服务器,一台Master,一台Slave,Master配置IP与域名的正向与反向对应关系,Slave进行同步。
编写docker-compose.yml
假定上面下载的centos image的名称为centos,标签为latest
version: "3"
services:
    dns_master:
      image: centos:latest
      container_name: dns_master
      hostname: dns_master
      privileged: true
      dns: 192.168.254.10
      networks:
        br0:
         ipv4_address: 192.168.254.10
dns_slave:
      image: centos:latest
      container_name: dns_slave
      hostname: dns_slave
      privileged: true
      dns:
        - 192.168.254.10
        - 192.168.254.11
      networks:
        br0:
         ipv4_address: 192.168.254.11
networks:
  br0:
    driver: bridge
     ipam:
       driver: default
       config:
         -
         subnet: 192.168.254.0/24
从docker-compose.yml文件可知我选择了bridge桥接网络模式,并为dns master和dns slave分别分配了ip.
在docker-compose.yml文件所在目录运行 docker-compose up 命令,创建名称分别为dns_master和dns_slave的容器。
配置DNS Master服务器
1.我们进入dns_master容器
docker exec -it dns_master /bin/bash
2.安装bind9 dns package
yum install bind bind-utils -y
3.修改配置文件named.conf
vim  /etc/named.conf
注意以双星号(**)包围的内容,只是为了强调,实际配置时应去掉

options {
        listen-on port 53 { 127.0.0.1;  **192.168.254.10;** };  //Master Dns Ip
        listen-on-v6 port 53 { ::1; };
        directory       "/var/named";
        dump-file       "/var/named/data/cache_dump.db";
        statistics-file "/var/named/data/named_stats.txt";
        memstatistics-file "/var/named/data/named_mem_stats.txt";
        recursing-file  "/var/named/data/named.recursing";
        secroots-file   "/var/named/data/named.secroots";
        allow-query     { localhost; **192.168.254.0/24;** }; // IP Ranges
        allow-transfer { localhost; **192.168.254.11;**};   // Slave Ip
......
....
zone "." IN {
        type hint;
        file "named.ca";
};
**
zone "elong.com" IN {
        type master;
        file "forward.yanggy"; // 正向解析文件
        allow-update { none; };
};
zone "254.168.192.in-addr.arpa" IN {
        type master;
        file "reverse.yanggy"; // 反向解析文件
        allow-update { none;};
};
**
include "/etc/named.rfc1912.zones";
include "/etc/named.root.key";
配置正向解析文件forward.yanggy
vim /var/named/forward.yanggy
$TTL  86400
@ IN SOA  masterdns.yanggy.com. root.yanggy.com. (
    2019011201  ;Serial
    3600        ;Refresh
    1800        ;Retry
    64800       ;Expire
    86400       ;Minimum TTL
)
@       IN NS   masterdns.yanggy.com.
@       IN NS   slavedns.yanggy.com.
@       IN A    192.168.254.10
@       IN A    192.168.254.11
masterdns       IN A    192.168.254.10
slavedns        IN A    192.168.254.11
4.配置反向解析文件
vim /var/named/reverse.yanggy
$TTL 86400
@   IN  SOA     masterdns.yanggy.com. root.yanggy.com. (
        2019011301  ;Serial
        3600        ;Refresh
        1800        ;Retry
        604800      ;Expire
        86400       ;Minimum TTL
)
@       IN  NS          masterdns.yanggy.com.
@       IN  NS          slavedns.yanggy.com.
@       IN  PTR         yanggy.com.
masterdns       IN  A   192.168.254.10
slavedns    IN  A   192.168.254.11
10     IN  PTR         masterdns.yanggy.com.
11     IN  PTR         slavedns.yanggy.com.
5.检查配置文件的正确性
named-checkconf /etc/named.conf
named-checkzone yanggy.com  /var/named/forward.yanggy
named-checkzone yanggy.com  /var/named/reverse.yanggy
第一条命令如果没错误,什么都不会输出,后面两条命令如果没错误,则输出内容包含OK.
6.启动named服务
systemctl enable named
systemctl start named
7.配置相关文件所属用户和组
chgrp named -R /var/named
chown -v root:named /etc/named.conf
restorecon -rv /var/named
restorecon /etc/named.conf
8.安装配置完成,开始测试
dig masterdns.yanggy.com
; <<>> DiG 9.9.4-RedHat-9.9.4-72.el7 <<>> masterdns.yanggy.com
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 65011
;; flags: qr aa rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 2, ADDITIONAL: 2
;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 4096
;; QUESTION SECTION:
;masterdns.yanggy.com.           IN      A
;; ANSWER SECTION:
masterdns.yanggy.com.    86400   IN      A       192.168.254.10
;; AUTHORITY SECTION:
yanggy.com.              86400   IN      NS      masterdns.yanggy.com.
yanggy.com.              86400   IN      NS      slavedns.yanggy.com.
;; ADDITIONAL SECTION:
slavedns.yanggy.com.     86400   IN      A       192.168.254.11
;; Query time: 19 msec
;; SERVER: 127.0.0.11#53(127.0.0.11)
;; WHEN: Mon Jan 14 09:56:22 UTC 2019
;; MSG SIZE  rcvd: 117
退出容器后,将此容器保存为image:dns_image,以后dns_master就用此image
docker commit dns_master dns_master
配置DNS Slave服务器
1.进入容器和安装bind。
yum install bind bind-utils -y
2.配置named.conf
options {
listen-on port 53 { 127.0.0.1; 192.168.254.11;};
listen-on-v6 port 53 { ::1; };
directory       "/var/named";
dump-file       "/var/named/data/cache_dump.db";
statistics-file "/var/named/data/named_stats.txt";
memstatistics-file "/var/named/data/named_mem_stats.txt";
recursing-file  "/var/named/data/named.recursing";
secroots-file   "/var/named/data/named.secroots";
allow-query     { localhost;192.168.254.0/24;};
....
....
zone "yanggy.com" IN {
type slave;
file "slaves/yanggy.fwd";
masters {192.168.254.10;};
};
zone "254.168.192.in-addr.arpa" IN {
type slave;
file "slaves/yanggy.rev";
masters {192.168.254.10;};
};
include "/etc/named.rfc1912.zones";
include "/etc/named.root.key";
3.启动dns服务
systemctl enable named
systemctl start named
4.启动成功后,就会在目录/var/named/slaves/下出现yagnggy.fwd和yanggy.rev,不用手动配置
5.配置相关文件的所属用户和用户组
chgrp named -R /var/named
chown -v root:named /etc/named.conf
restorecon -rv /var/named
restorecon /etc/named.conf
6.配置完后,也可照上面方法测试,看是否正常。
7.退出窗器后,将此容器保存为image:dns_slave,以后dns_slave就用此image