使用CoreDNS Docker容器配置本地DNS解析服务

364 阅读4分钟

1. 拉取Ubuntu:22.04镜像

sudo docker pull ubuntu:22.04

2. 将Ubuntu:22.04的APT源修改为阿里云的镜像源

sed -i.bak 's|http://.*archive.ubuntu.com/ubuntu/|http://mirrors.aliyun.com/ubuntu/|g; s|http://.*security.ubuntu.com/ubuntu/|http://mirrors.aliyun.com/ubuntu/|g' /etc/apt/sources.list

这个命令的作用是:

  • 使用 -i.bak 选项创建原文件的备份(带有 .bak 扩展名)。
  • /etc/apt/sources.list 中的官方源地址替换为阿里云的镜像源地址。 然后需要更新:
apt update

3. 安装wget,vim,dnsutils

apt install -y vim wget dnsutils

4. 将完成了上述步骤的容器导出为Docker镜像

docker commit <container_id_or_name> <new_image_name>

将上述<container_id_or_name><new_image_name>分别替换为你自己实际的容器id/名字和镜像名即可。

5. 创建一个用于演示coredns的docker网络

假设我们会创建一个名为coredns-net的网络:

sudo docker network create coredns-net

6. 使用刚才导出的docker镜像运行三个容器:coredns-server,coredns-client1,coredns-client2,并将它们添加到同一个局域网

假设刚才导出的docker镜像命名为coredns-host:

# 创建coredns-sever容器:
sudo docker run \
	--name coredns-server \
	--network coredns-net \
	-it \
	coredns-host \
	/bin/bash
# 进入了coredns-server容器的shell之后就可以exit了

# 创建coredns-client1容器:
sudo docker run \
	--name coredns-client1 \
	--network coredns-net \
	-it \
	coredns-host \
	/bin/bash
# 进入了coredns-client1容器的shell之后就可以exit了

# 创建coredns-client2容器:
sudo docker run \
	--name coredns-client2 \
	--network coredns-net \
	-it \
	coredns-host \
	/bin/bash
# 进入了coredns-client2容器的shell之后就可以exit了

7. 在coredns-server容器安装coredns

7. 1 到coredns的github release页面找到对应的压缩包

比方说你是在Mac M1上运行的docker,那就可以选择linux_arm64压缩包

7.2 重新进入coredns-server容器以安装coredns

首先,重新进入coredns-server容器:

sudo docker start -i coredns-server

然后,可以在容器内的根目录新建一个coredns目录已保存将要下载并解压的coredns压缩包:

mkdir /coredns && cd /coredns
wget https://github.com/coredns/coredns/releases/download/v1.11.1/coredns_1.11.1_linux_arm64.tgz
tar -zvxf coredns_1.11.1_linux_arm64.tgz -C ./

最后,验证一下是否可以运行:

./coredns -version

8. 在coredns-server容器编写DNS区域文件

8.1 DNS区域文件

DNS区域文件(zone file)是保存DNS域名配置的文件,一般一个域名对应一个区域文件。关于区域文件的更多解释,可以参考以下文章:

8.2 编写DNS区域文件

# 先创建存放区域文件的目录:
mkdir -p /etc/coredns/zones

# 然后使用vim创建对应的区域文件,比方说我们要创建一个closed.ai域名:
vim /etc/coredns/zones/closed.ai.db

在打开的vim编辑器里填入以下内容:

@ IN SOA dns.closed.ai. admin.closed.ai. (
                2024010101 ; serial
                3600       ; refresh (1 hour)
                1800       ; retry (30 minutes)
                1209600    ; expire (2 weeks)
                86400      ; minimum TTL (1 day)
              )

@ IN NS dns.closed.ai.

@   IN A 172.18.0.5
ns  IN A 172.18.0.5
www IN A 172.18.0.5

9. 在coredns-server容器编写Corefile

9.1 Corefile是什么

关于Corefile,直接查看coredns的官方文档即可:

9.2 编写Corefile

vim /etc/coredns/Corefile

然后在打开的vim编辑器里填入以下内容:

closed.ai {
    file /etc/coredns/zones/closed.ai.db
    log
    errors
}

. {
    forward . 127.0.0.11
    cache 30
    log
    errors
}

9.3 Corefile配置简述

上述 Corefile 配置了两个不同的 DNS 区域,每个区域都有自己的特定处理方式。

第一个区域:closed.ai

closed.ai {
    file /etc/coredns/zones/closed.ai.db
    log
    errors
}
  • closed.ai { ... }:这个部分配置了 closed.ai 域名的处理方式;
    • file /etc/coredns/zones/closed.ai.db:指定了一个文件 /etc/coredns/zones/closed.ai.db 来加载 closed.ai 域名的 DNS 记录。这意味着所有关于 closed.ai 的 DNS 查询都将根据这个文件中的内容进行解析;
    • log:启用日志记录,将查询和响应的详细信息记录下来,便于调试和监控;
    • errors:启用错误日志记录,将查询过程中发生的错误记录下来。

第二个区域:default

. {
    forward . 127.0.0.11
    cache 30
    log
    errors
}
  • . { ... }:这个部分配置了默认区域的处理方式,用于处理其他所有域名的查询;
    • forward . 127.0.0.11:将所有查询转发给本地 IP 地址 127.0.0.11 进行处理,由于这是运行在docker容器内的,所以这个127.0.0.11是docker指定的,我们无须手动修改;
    • cache 30:启用缓存,将查询结果缓存 30 秒。这可以减少重复查询的响应时间,提升性能;
    • log:启用日志记录,将查询和响应的详细信息记录下来,便于调试和监控;
    • errors:启用错误日志记录,将查询过程中发生的错误记录下来。

10. 在coredns-server容器启动coredns

# 假设coredns保存在根目录的/coredns目录:
cd /coredns

# 以指定的Corefile配置文件来启动cordns:
./coredns -conf /etc/coredns/Corefile

11. 修改coredns-client容器的DNS服务器地址

首先,进入coredns-client,比如说进入coredns-client1容器:

sudo docker start -i coredns-client1

然后,将两个coredns-client容器的DNS服务器地址修改为指向coredns-server(ip地址为172.18.0.5):

vim /etc/resolv.conf

# 在打开的vim编辑器里填入以下内容:
# nameserver 127.0.0.11
nameserver 172.18.0.5
options ndots:0

12. 在coredns-client容器上使用dig测试指定的域名

可以在coredns-client1容器上运行以下命令:

dig www.closed.ai +short  #+short表示以简短形式返回DNS查询结果

如果命令行输出172.18.0.5,就证明上述配置正确无误!