使用Docker方式搭建DNS服务器 - CoreDNS

devopscube,Devops魔方为个人公众号,主要用于一些有关Devops,容器,kubernetes,自动化运维,以及敏捷开发相关的分享。同时也会不定期的分享一些个人心得,比如推荐一些个人使用的办公小软件,对一些事件的评论等。欢迎大家关注交流。
在这里插入图片描述

介绍

在这里插入图片描述

CoreDNS是一款Go语言编写的开源DNS服务器。作为CNCF毕业项目,目前已经成为kubernetes环境中的DNS服务器的标准配置。其快速,简单,可扩展等特性也非常受人欢迎。

官网: https://coredns.io/

Github: https://github.com/coredns/coredns

安装

本文主要介绍安装独立运行的coredns,所以不会尝试在kuberentes上安装。大多数的发行版本kubernets都会自带Coredns,所以本文并不涉及此处。

CoreDNS需要Go的环境去编译和运行。如果你不希望在你的环境中安装go环境,或者安装go的环境有障碍,Docker的安装方式更加适合你。

从dockerhub上可以看到最新的coredns的版本是1.6.9,我们以此为版本进行安装
在这里插入图片描述
从Dockerfile来看,其应用入口即coredns命令,所以我们配置如下docker命令启动coredns

首先,我们编写一个CoreDns的配置文件Corefile,这里我们使用最简单的配置进行测试。

.:53 {
    forward . 8.8.8.8:53
    log
}

以上配置是指将DNS请求转发到8.8.8.8进行解析。

将该文件放到一个文件路径下,例如,本文使用/data/coredns/Corefile

运行docker 命令启动CoreDNS

# docker run -it -d --net=host \
--name=coredns --restart=always \
-v /data/coredns:/etc/coredns/ \
coredns/coredns:1.6.9 \
-conf /etc/coredns/Corefile

几个注意的点:

  1. --net=host要指定,如果不指定,在同宿主机的容器中无法查询DNS。如果指定了该项,则无须指定-p选项。默认使用宿主机的端口。例如端口53。
    在容器中使用dig命令的报错信息:

    [root@f83bb3a439bb /]#  dig 192.168.100.3 -p 53 a whoami.example.org
    ;; reply from unexpected source: 172.17.0.1#53, expected 192.168.100.3#53
    ;; reply from unexpected source: 172.17.0.1#53, expected 192.168.100.3#53
    
  2. --restart=always在docker服务重启后可以自动启动该容器。

  3. -v指定volume挂载地址,可以在容器之外修改coredns的配置

  4. 命令参数中显式指定Corefile的位置。

启动之后我们在另外一个容器中测试该配置,docker run命令可以指定覆盖dns的服务器地址:

# docker run -it --rm --dns=192.168.100.3 centos:latest /bin/bash
# cat /etc/resolv.conf
search centos
nameserver 192.168.100.3

# ping www.baidu.com
PING www.wshifen.com (104.193.88.123) 56(84) bytes of data.
64 bytes from 104.193.88.123 (104.193.88.123): icmp_seq=1 ttl=47 time=152 ms
64 bytes from 104.193.88.123 (104.193.88.123): icmp_seq=2 ttl=47 time=153 ms
64 bytes from 104.193.88.123 (104.193.88.123): icmp_seq=3 ttl=47 time=151 ms

[root@f83bb3a439bb /]# nslookup www.baidu.com
Server:         192.168.100.3
Address:        192.168.100.3#53

Non-authoritative answer:
www.baidu.com   canonical name = www.a.shifen.com.
www.a.shifen.com        canonical name = www.wshifen.com.
Name:   www.wshifen.com
Address: 104.193.88.77
Name:   www.wshifen.com
Address: 104.193.88.123

resolve.conf已经配置成我们的服务器宿主机地址,运行pingnslookup命令可以看到成功解析www.baidu.com的地址。 证明我们的配置已经可以正常运行。

配置

下面我们可以尝试自己添加一些自定义的域名。 CoreDNS使用插件的方式实现一系列的功能。 例如上面例子中的forward插件,实现了DNS转发的功能。如果我们只是想添加一个域名,能够解析成我们指定的IP,可以尝试使用host插件。

我们将上面的Corefile修改一下:

.:53 {
    hosts {
        10.0.0.1 example.org
        fallthrough
    }
    forward . 8.8.8.8:53
    log
}

然后重启我们的CoreDNS的容器,重新加载Corefile

此时我们再次在另外一个容器中测试就能看到添加的A记录可以正常解析了:

[root@f83bb3a439bb /]# nslookup example.org
Server:         192.168.100.3
Address:        192.168.100.3#53

Name:   example.org
Address: 10.0.0.1

[aiops@3 coredns]$ dig 192.168.100.3 -p 53 a example.org

; <<>> DiG 9.11.4-P2-RedHat-9.11.4-9.P2.el7 <<>> @localhost -p 53 a example.org
; (2 servers found)
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 10522
;; flags: qr aa rd; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 1
;; WARNING: recursion requested but not available

;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 4096
;; QUESTION SECTION:
;example.org.                   IN      A

;; ANSWER SECTION:
example.org.            3600    IN      A       10.0.0.1

;; Query time: 0 msec
;; SERVER: ::1#53(::1)
;; WHEN: 三 4月 08 14:51:14 CST 2020
;; MSG SIZE  rcvd: 67

我们也可以使用文件的形式去保存和管理hosts,这样更加方便。

# ls
Corefile  hostsfile
# cat Corefile
.:53 {
    hosts /etc/coredns/hostsfile {
        fallthrough
    }
    forward . 8.8.8.8:53
    log
}
# cat hostsfile
10.0.0.1 example1.org

更多的插件请移步官网: https://coredns.io/plugins/

总结

如果你需要独立安装一款DNS服务器,CoreDNS也可以作为你的选择。

配置简单,操作方便,插件丰富。

CoreDNS之所以在kubernetes中已经成为标配,是因为其提供的插件的能力,同时可以对外提供metrics。

以后我们有时间可以深入了解一下kubernets中CoreDNS的运作方式。

发布了9 篇原创文章 · 获赞 0 · 访问量 431

猜你喜欢

转载自blog.csdn.net/weixin_36938307/article/details/105390004