因为有内网域名的需求,所以使用 AdGuard 搭建了多台域名服务器。考虑到服务的连续性,通过负载均衡设备自动踢掉故障服务,同时使用 docker 创建 多个 AdGuard 服务,保障服务出现故障时可以快速恢复。
其中 AdGuard 有两种部署方式,一种是单台部署,一台主机只运行一个 AdGuard 服务。因为 DNS 会用到 TCP和UDP 的 53 端口,单台主机只能保留一个 AdGuard 服务。另一种方式是使用 Docer 的 macvlan 方式,在一台主机上绑定多个IP,每个IP都拥有一套 53 端口。
单台服务模式:
docker pull adguard/adguardhome
docker run --name adguardhome
--restart unless-stopped
-v /mydns/workdir:/opt/adguardhome/work
-v /mydns/confdir:/opt/adguardhome/conf
-p 53:53/tcp
-p 53:53/udp
-p 67:67/udp -p 68:68/udp
-p 80:80/tcp
-p 443:443/tcp
-p 443:443/udp
-p 3000:3000/tcp
-p 853:853/tcp
-p 784:784/udp
-p 853:853/udp
-p 8853:8853/udp
-p 5443:5443/tcp
-p 5443:5443/udp
-d adguard/adguardhome
使用 macvlan 模式:
$ docker pull adguard/adguardhome
$ docker network create -d macvlan
--subnet=10.1.1.0/24
--gateway=10.1.1.254
-o parent=eth0 mymacvlan
$ docker run --name adguard
--ip=10.1.1.1
--network mymacvlan
-d adguard/adguardhome
$ docker run --name adguard-2
--ip=10.1.1.5
--network mymacvlan
-d adguard/adguardhome
使用 macvlan 的方式可以在一台主机上运行多个 AdGuard 服务。使用 docker network 命令可以管理 macvlan 网络。
docker network ls
docker network inspect mymacvlan
docker network disconnect mymacvlan adguard
docker network connect --ip 10.1.1.1 mymacvlan adguard
对于 AdGuard 服务,我们主要用到了它的DNS重写功能,具体到配置文件就是 AdGuardHome.yaml 中的 rewrites 属性。
当没有做数据持久化时,数据存在 overlay 文件系统中。我们可以通过 docker inspect 来定位配置文件的位置。
docker inspect adguard | grep MergedDir
配置文件在 MergedDir 目录下
${MergedDir}/opt/adguardhome/conf/AdGuardHome.yaml
通过备份或还原配置文件就可以实现多台 AdGuard 服务的配置同步。多套 AdGuard 服务可以共用一套配置文件。因为所有的配置都是基于 YAML 文件的,所以替换配置文件后重启 docker 服务即可。
# 更新 AdGuardHome.yaml 后需求重启服务
$ docker restart adguard
检查一下 AdGuard 容器的存储策略是否使用的 overlay 挂载方式,如果使用 overlay 方式重启容器数据文件不会丢失,除非销毁容器,不然数据都在 overlay 的 MergedDir 存储。
全文完。
评论