本文属于「自托管 Docker 部署实战」系列(共 35 篇),第 1 篇。 示例中的 IP(192.0.2.10)、域名(example.com)、密码均为占位符,请按实际环境替换。

它是什么

全网 DNS 级广告拦截,兼做 DoH/DoT 解析器。

前置条件

  • 一台 Linux 服务器(1C1G 起步;Java 类应用建议 2C4G 以上);
  • 已安装 Docker 与 Compose v2,执行 docker compose version 有版本号输出;
  • 所有示例里的 IP / 域名 / 密码都是占位符,实际部署请替换成自己的。
# 安装 Docker(已安装可跳过)
curl -fsSL https://get.docker.com | sh

# 目录约定:一个服务一个目录,后文的 ./data 均指栈目录内
mkdir -p /srv/docker/active/<stack> && cd /srv/docker/active/<stack>

镜像地址

adguard/adguardhome:v0.107.79

目录结构

/srv/docker/active/adguard/
├── docker-compose.yml
├── conf/                # AdGuardHome.yaml
└── work/                # 查询日志、统计数据库

部署步骤

services:
  adguardhome:
    image: adguard/adguardhome:v0.107.79
    container_name: adguardhome
    restart: unless-stopped
    ports:
      - "53:53/tcp"
      - "53:53/udp"
      - "80:80/tcp"          # 初始化向导(可改)
      - "443:443/tcp"        # DoH/DoT(有冲突就换)
      - "3000:3000/tcp"      # 管理后台
      - "853:853/tcp"
      - "784:784/udp"
    volumes:
      - ./work:/opt/adguardhome/work
      - ./conf:/opt/adguardhome/conf
    command:
      - --no-check-update
      - -c
      - /opt/adguardhome/conf/AdGuardHome.yaml
      - -w
      - /opt/adguardhome/work
docker compose up -d
# 首次访问 http://<SERVER_IP>:3000 完成初始化

关键配置

  • 初始化时 DNS 监听选 53,管理端口选 3000;
  • AdGuardHome.yaml 在 conf/,备份它 = 备份全部规则;
  • 上游 DNS 建议配两组 DoH(如 Cloudflare/Quad9),避免单点;
  • 客户端把 DNS 指向 <SERVER_IP> 即可全网生效。

注意事项

  • 宿主机 53 端口常被 systemd-resolved 占用:

bash systemctl stop systemd-resolved systemctl disable systemd-resolved # 或改 /etc/systemd/resolved.conf 的 DNSStubListener=no

  • 443 端口如果被 Nginx 占用,DoH 换 5443 之类的端口;
  • AdGuard 挂了 = 全网断网,建议保留一个备用 DNS;
  • 查询日志会涨,定期清理或关闭「记录查询日志」。

备份与升级

# 配置与统计数据库
tar czf "adguard-$(date +%F).tar.gz" ./conf ./work

# 升级
docker compose pull
docker compose up -d
  • conf/AdGuardHome.yaml 是全部规则与上游配置,丢了要重配;
  • 升级后确认 DNS 仍在监听:ss -lunp | grep :53。