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:启用错误日志记录,将查询过程中发生的错误记录下来。
- forward . 127.0.0.11:将所有查询转发给本地 IP 地址
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,就证明上述配置正确无误!