使用 CoreDNS 搭建本地域名服务

前言⌗
习惯了 laravel/valet 的方便后,在使用 Docker 搭建的开发环境中,经常需要再本地 /etc/hosts
文件中给项目设置本地域名。这样会导致一个问题,那就是每个人自己配置的域名可能不同,而很多时候成员间需要通过 URL 来交流和复现问题。
比如 A 开发给 CRM 项目的域名是 crm.localhost
,B 开发给 CRM 项目的域名是 crm.dev
这样导致我们公用的 API 调试器中需要为每个人定义一套环境,与此同时在复现问题时,也增加了一定的沟通成本。
那么为了尽可能的保持环境的一致性,我们将服务的访问域名也通过配置文件内置于 Docker 的 Compose 编排中,这样一来,每个人不需要做什么,只需要执行 docker compose up -d
就能够得到一致的开发环境,包括域名和 HTTPS 证书等!
选型⌗
为了实现高度统一的愿景,我调研了如下一些开源项目:
- dnsmasq
- CoreDNS
- AdGuardDNS
因为 laravel/valet 使用的也是 dnsmasq,所以我优先考虑选择 dnsmasq,但是扒了一圈,没有找到官方维护的 Docker Image,有一些个人开发者维护的版本,想想还是算了!
后来发现 CoreDNS 基于 Go 语言开发,且是 Cloud Native 孵化的毕业项目,后期的社区肯定是没的说。简单试用了了一下发现基本符合我们的需求,支持通配符解析。
AdGuard Home 算是一个意料之外的收货,为什么这么说呢,因为它面向的是普通用户,而不是开发者,提供了简洁美观的管理界面。但是不太适合我们的地方在于,它主要是用来拦截广告的,并且配置需要登录管理后台配置自定义域名的重写,也支持通配符解析。
经过对比我们最终选择了 CoreDNS,一方面是更强大的社区、丰富的插件以及可通过配置文件保证一致性。
获取镜像⌗
因为我们团队使用的都是基于 ARM 架构的 M1 Chip,而官方目前并未提供 ARM 架构的 Docker Image,所以我们使用的是自己构建了一个 ARM 架构的 Docker Image。
其他架构 CPU 可以拉取 CoreDNS 官方 Docker Image
配置⌗
首先创建 docker-compose.yml
容器编排配置文件:
新版的 Docker Compose 不再需要定义
version
了。
接着创建 CoreDNS 的配置文件夹:
例如我我们将 betterde.it
这个 TLD 作为本地开发环境的域名,并在文件夹下创建 Corefile 配置文件:
最后创建一个用于定义域名解析的数据文件 betterde.it.db
:
如果你配置过 BIND 的域名服务器 zone,对上面的
betterde.it.db
配置文件应该并不陌生,其中george.example.com.
是管理者邮箱,因为@
在zone
配置文件中有其他用户,所以,这里用.
替代。
启动服务⌗
验证结果⌗
使用 CoreDNS⌗
在 macOS 上使用自己的 DNS 可以通过如下步骤来管理命令来进行配置:
- 查看系统 DNS 优先级
可以看到现在使用的是阿里云 DNS 223.6.6.6 和电信 202.46.34.75 作为 DNS 的。
- 列出所有的网络连接方式:
- 给指定的网络连接方式设定 DNS 服务器
例如我这里是通过 Wi-Fi 联网的,所以我这里给 Wi-Fi 设备设置 DNS 查询走本地 Loopback 地址
127.0.0.1
。
- 验证结果
通过上面的结果可以看到,现在使用的是 127.0.0.1 作为 DNS 的。
总结⌗
到此,一个小而全的 DNS 就搭建完成了,而它将成为我们团队协作的一个必要基础设施!
如果需要取消使用 CoreDNS 可以使用如下命令:
最后清理 DNS 缓存
I hope this is helpful, Happy hacking…