使用 Docker 部署 AdguardHome

本文介绍如何在 Ubuntu 中通过 Docker 部署 AdguardHome 实现 DNS 解析和广告过滤。

docker compose

使用下面的 docker-compose 启动

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
services:
adguardhome:
image: adguard/adguardhome
container_name: adguardhome
restart: unless-stopped
volumes:
- ./data/workdir:/opt/adguardhome/work # 挂载数据
- ./data/confdir:/opt/adguardhome/conf # 挂载配置
ports:
- 53:53/tcp
- 53:53/udp
# - "67:67/udp"
# - "68:68/udp"
# - "80:80/tcp"
# - "443:443/tcp"
# - "443:443/udp"
- "3000:3000/tcp"
# - "853:853/tcp"
# - "784:784/udp"
# - "853:853/udp"
# - "8853:8853/udp"
# - "5443:5443/tcp"
# - "5443:5443/udp"
dns:
- 223.6.6.6
- 119.29.29.29

问题排查

启动容器可能会报错:required port 53 already in use

这说明 53 端口已经被占用,这个端口默认被 systemd-resolved 占用。

查看占用的进程

1
sudo lsof -i :53

若显示如下输出,则说明被 systemd-resolved 占用了。

image-20241126102219940

解除占用

  1. 先停用 systemd-resolved 服务

    1
    sudo systemctl stop systemd-resolved
  2. 编辑 /etc/systemd/resolved.conf 文件,取消 DNSStubListener

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    vi /etc/systemd/resolved.conf

    # 将 DNSStubListener 设置为 no
    [Resolve]
    #DNS=8.8.8.8
    #FallbackDNS=
    #Domains=
    #LLMNR=no
    #MulticastDNS=no
    #DNSSEC=no
    #Cache=yes
    DNSStubListener=no #取消注释,把yes改为no
  3. 将 resolv.conf 指向 systemd-resolved 管理的文件

    在现代 Linux 系统中,systemd-resolved 是一个用于管理 DNS 解析的服务。它提供了对 DNS、LLMNR 和 mDNS 的支持,并可以动态更新 DNS 配置。通过将 resolv.conf 指向 systemd-resolved 管理的文件,可以确保系统的 DNS 配置始终与 systemd-resolved 保持一致。

    1
    2
    3
    4
    # 备份原来的 resolv.conf
    sudo cp /etc/resolv.conf /etc/resolv.conf.bak
    # 删除原文件并建立软链接
    sudo ln -sf /run/systemd/resolve/resolv.conf /etc/resolv.conf

参考

本文参考以下文章,在此致以诚挚谢意!

adguard/adguardhome - Docker Image | Docker Hub

Linux systemd-resolve占用53端口的解决方法