Technitium DNS Server Docker Compose 部署指南

Technitium DNS Server 15.6.2 Docker Compose 单容器部署指南:官方镜像选型、5300 高位端口映射取舍(systemd-resolved 占用 53 实录)、显式子网网络、持久化、环境变量表、等价 docker run 与运维命令,含登录、递归解析与本地权威 zone 实测回显。

Technitium DNSDNS 服务2026/10/19

Technitium DNS Server Docker Compose 部署指南

目标:用官方镜像在单机上完成 Technitium DNS Server 15.6.2 的容器化部署,覆盖端口取舍、网络隔离、数据持久化、初始化验证(Web 登录、递归解析、本地权威 zone)与日常运维命令。全流程已在 Ubuntu 22.04.4 LTS x86_64 + Docker 29.8.1 环境实测通过,所有回显均为实测原文。

一、环境信息

本文实测环境与关键可复现信息如下(uname -m、grep PRETTY /etc/os-release、docker --version、dig -v 实测回显):

  • 操作系统:Ubuntu 22.04.4 LTS(x86_64)
  • Docker:Docker version 29.8.1, build 4a63305;Docker Compose version v5.5.1
  • DNS 客户端:DiG 9.18.39-0ubuntu0.22.04.6-Ubuntu
  • 软件:Technitium DNS Server v15.6.2(2026-10-17 发布的最新稳定版)
  • 镜像:technitium/dns-server:15.6.2(压缩层 112.9 MB,解压后 405 MB,Image ID eb48ac5c135f)
  • 部署目录:/opt/data/quzuo/technitium-dns/(compose 文件 + 持久化数据)
  • 容器名:technitium-dns-15.6.2-server
  • 专用网络:technitium-dns-net,显式子网 10.89.46.0/24,容器固定 IP 10.89.46.10
  • 端口映射:宿主 8118→5380(Web 管理台)、5300→53(DNS UDP/TCP)、8530→853(DoT)、9543→443(DoH);宿主 53 被占用故 DNS 映射高位 5300(取舍见 4.4 节)

二、镜像选型说明

官方镜像托管于 Docker Hub technitium/dns-server,基于 mcr.microsoft.com/dotnet/aspnet:10.0 构建,内含 dnsutils(dig)、curl 等排障工具。选型时遵循「固定版本 tag,不用 latest」原则,保证可复现与可控升级。

2026-10-19 查询 Docker Hub API(hub.docker.com/v2/repositories/technitium/dns-server/tags)返回的近期 tag:

latest       2026-10-17 size: 112.9 MB
15.6.2       2026-10-17 size: 112.9 MB
15.6.1       2026-10-11 size: 112.8 MB
15.6.0       2026-10-03 size: 112.8 MB
15.5.1       2026-09-26 size: 112.8 MB
15.5.0       2026-09-19 size: 112.8 MB
15.4.0       2026-07-11 size: 111.2 MB

latest 与 15.6.2 摘要一致(均为 sha256:eb48ac5c135f4ab936b536f74f853d53e15ab39ef37fdbc9598a089b90d9f245),本文固定使用 15.6.2 tag。镜像内非 root 场景无需特殊内核参数,仅官方 compose 建议放大临时端口范围(见第七节 sysctls 说明)。

三、前置条件

部署前逐项确认宿主机具备以下条件,每项都给出实测核验命令与回显。

1. 端口占用复核(关键):DNS 服务依赖 53、Web 依赖 5380(本文映射 8118)。先看宿主 53 的占用:

ss -ltn | grep ':53 '

实测回显:

LISTEN 0      4096   127.0.0.53%lo:53         0.0.0.0:*

127.0.0.53:53 是 systemd-resolved 的 stub 监听——Ubuntu 22.04 默认行为。它占用了 127.0.0.53 这个具体地址上的 53 端口,导致后续任何绑定 0.0.0.0:53 的尝试都会失败(4.4 节实测复现)。5380/8118/5300/8530/9543 均未占用:

ss -ltn | grep -E ':(5380|8118|5300|8530|9543)\b'

实测回显(无输出即未占用;本文环境中 8443 已被其他服务占用,故 DoH 选择 9543):

(无输出)

2. Docker 与 Compose 可用:

docker --version && docker compose version

实测回显:

Docker version 29.8.1, build 4a63305
Docker Compose version v5.5.1

3. 部署目录:

mkdir -p /opt/data/quzuo/technitium-dns/config /opt/data/quzuo/technitium-dns/logs && ls /opt/data/quzuo/technitium-dns/

实测回显:

config  logs

4. 网段规划:专用 bridge 网络显式指定 --subnet 10.89.46.0/24(避开宿主物理网段 192.168.0.0/16 与已占用的 100.64.0.0/16,防止路由抢占)。

四、部署步骤

4.1 创建专用网络

独立网络隔离 DNS 流量,并为容器固定 IP(便于后续条件转发等引用):

docker network create -d bridge --subnet 10.89.46.0/24 technitium-dns-net

实测回显(输出为网络 ID):

6a18b7bbf543d38d8e3be668b8b27ef2b22130b6317088188e85b8cb7e661475

自查子网未落在禁用段,且宿主默认路由不受影响:

docker network inspect technitium-dns-net --format '{{range .IPAM.Config}}{{.Subnet}}{{end}}'
ip route get 192.168.1.62

实测回显:

10.89.46.0/24
192.168.1.62 via 192.168.146.2 dev ens33 src 192.168.146.128 uid 0
    cache

dev ens33 确认默认路由仍走物理网卡,网桥未抢占路由。

4.2 编写 docker-compose.yml

在 /opt/data/quzuo/technitium-dns/docker-compose.yml 写入:

services:
  dns-server:
    container_name: technitium-dns-15.6.2-server
    hostname: dns-server
    image: technitium/dns-server:15.6.2
    ports:
      - "8118:5380/tcp"       # Web 管理台(HTTP)
      - "5300:53/udp"         # DNS UDP(宿主 53 被 systemd-resolved stub 占用,映射高位 5300)
      - "5300:53/tcp"         # DNS TCP
      - "8530:853/tcp"        # DNS-over-TLS(按需启用)
      - "9543:443/tcp"        # DNS-over-HTTPS(按需启用;宿主 8443 已被其他服务占用)
      - "9543:443/udp"        # DNS-over-HTTPS HTTP/3(按需启用)
    environment:
      - DNS_SERVER_DOMAIN=dns-lab.internal          # 本机主 FQDN(首次启动初始化用)
      - DNS_SERVER_ADMIN_PASSWORD=q1w2e3r4          # Web 控制台 admin 初始密码(仅首次启动生效)
      - DNS_SERVER_LOG_FOLDER_PATH=/var/log/technitium/dns   # 查询/系统日志目录(随 logs 卷持久化)
      - DNS_SERVER_LOG_MAX_LOG_FILE_DAYS=90         # 日志保留天数,超期自动删除;0 为不清理
    volumes:
      - /opt/data/quzuo/technitium-dns/config:/etc/dns              # 配置 + zone 数据(核心持久化)
      - /opt/data/quzuo/technitium-dns/logs:/var/log/technitium/dns # 查询日志/系统日志
    healthcheck:
      test: ["CMD-SHELL", "curl -f http://127.0.0.1:5380/api/dnsClient/healthCheck | grep '\"status\":\"ok\"'"]
      interval: 30s
      timeout: 10s
      retries: 3
      start_period: 10s
    restart: unless-stopped
    sysctls:
      - net.ipv4.ip_local_port_range=1024 65535
    networks:
      default:
        ipv4_address: 10.89.46.10

networks:
  default:
    external: true
    name: technitium-dns-net

配置要点逐项说明:

  • container_name:固定容器名,运维命令可直接引用;
  • ports:四组映射见第一节;53 走 5300 的取舍依据在 4.4 节实测;
  • environment:仅在配置目录为空(首次启动)时生效,用于免交互完成初始化;配置落盘后改动这些变量不再有作用(9 节实测验证);
  • volumes:官方镜像的程序以 /etc/dns 作为配置目录参数(Dockerfile CMD ["/etc/dns"]),zone 数据、用户、统计全在其中,必须持久化;日志目录独立挂载便于按天巡检;
  • healthcheck:官方 compose 同款——curl 调用健康检查 API 并校验 "status":"ok",30 秒一次;
  • sysctls:放大容器临时端口范围,与官方 compose 建议一致(递归解析需要大量临时端口);
  • networks:复用 4.1 创建的外部网络并固定 IP。

4.3 拉取镜像并启动

cd /opt/data/quzuo/technitium-dns && docker compose up -d

实测回显:

 Container technitium-dns-15.6.2-server Creating
 Container technitium-dns-15.6.2-server Created
 Container technitium-dns-15.6.2-server Starting
 Container technitium-dns-15.6.2-server Started

确认状态与健康检查:

docker compose ps

实测回显:

NAME                           IMAGE                          COMMAND                   SERVICE      CREATED         STATUS                    PORTS
technitium-dns-15.6.2-server   technitium/dns-server:15.6.2   "/usr/bin/dotnet /op…"   dns-server   6 seconds ago   Up 6 seconds (healthy)   80/tcp, 67/udp, 443/udp, 443/tcp, 8053/tcp, 853/udp, 53443/tcp, 0.0.0.0:5300->53/tcp, 0.0.0.0:5300->53/udp, [::]:5300->53/tcp, [::]:5300->53/udp, 0.0.0.0:9543->443/tcp, 0.0.0.0:9543->443/udp, [::]:9543->443/tcp, [::]:9543->443/udp, 0.0.0.0:8530->853/tcp, [::]:8530->853/tcp, 0.0.0.0:8118->5380/tcp, [::]:8118->5380/tcp

Up 6 seconds (healthy) 即健康检查通过。启动日志确认版本:

docker logs technitium-dns-15.6.2-server 2>&1 | head -8

实测回显:

Technitium DNS Server v15.6.2 was started successfully.
Started on: 10/19/2026 05:01:46 Local Time
Using config folder: /etc/dns

Note: Open http://dns-server:5380 in web browser to access web console.

Press [CTRL + C] to stop...

4.4 端口取舍:为什么 DNS 映射 5300 而不是 53

宿主 53 已被 systemd-resolved stub(127.0.0.53)占用(3 节实测)。若强行把容器 53 映射到宿主 53,Docker 无法绑定,实测复现:

docker run --rm --name technitium-port-test -p 53:53/udp -p 53:53/tcp --entrypoint true technitium/dns-server:15.6.2

实测报错原文:

docker: Error response from daemon: failed to set up container networking: driver failed programming external connectivity on endpoint technitium-port-test (ee88da96deed7e7574eabf187c307d7ba438da2ec17dfed3a6245645e4c40b04): failed to bind host port 0.0.0.0:53/tcp: address already in use

Run 'docker run --help' for more information

两种解决取舍:

方案做法适用
A:释放宿主 53编辑 /etc/systemd/resolved.conf 设 DNSStubListener=no,systemctl restart systemd-resolved 后映射 53:53该服务器专职做 DNS(生产推荐),内网设备可直接指向其 53 端口
B:映射高位端口保持系统默认,映射 5300:53,客户端 dig @<IP> -p 5300共享宿主机/测试环境(本文实测采用,不动系统配置风险最小)

⚠️ 注意:方案 A 重启 resolved 前确认 /etc/resolv.conf 指向(stub 依赖),避免把宿主机自身解析弄断;共享环境优先方案 B。同理,Web 台默认 5380 若被占用也按此思路换高位(本文映射为 8118)。

4.5 部署验证(Web 登录 / 递归解析 / 权威 zone)

验证 1:Web 管理台可达 + 登录。浏览器打开 http://<宿主IP>:8118,账号 admin、密码 q1w2e3r4(compose 环境变量初始化值)。等价的 API 实测(与 Web 台同源):

curl -s -o /dev/null -w "HTTP %{http_code} (%{time_total}s)\n" http://127.0.0.1:8118/
curl -s -X POST "http://127.0.0.1:8118/api/user/login?user=admin&pass=q1w2e3r4" | head -c 300

实测回显:

HTTP 200 (0.026708s)
{"displayName":"Administrator","username":"admin","type":"Local","isSsoUser":false,"totpEnabled":false,"token":"25610161b21557868ac5b7d83654d2bf069f995bbba201c752870efcac21f741","server":"dns-lab.internal","status":"ok"}

status: ok 且返回会话 token,登录链路完整。

验证 2:递归解析(UDP + TCP):

dig @127.0.0.1 -p 5300 www.baidu.com A +noall +answer
dig @127.0.0.1 -p 5300 cloudflare.com A +tcp +noall +answer

实测回显:

www.baidu.com.          1200    IN      CNAME   www.a.shifen.com.
www.a.shifen.com.       120     IN      A       110.242.70.57
www.a.shifen.com.       120     IN      A       110.242.69.21
cloudflare.com.         300     IN      A       104.16.133.229
cloudflare.com.         300     IN      A       104.16.132.229

默认递归策略 AllowOnlyForPrivateNetworks(仅私网可递归),127.0.0.1 属私网可正常递归。

验证 3:本地权威 zone。登录拿 token 后创建 Primary zone 并加记录:

TOKEN=<上一步返回的token>
curl -s -X POST "http://127.0.0.1:8118/api/zones/create?token=$TOKEN&zone=lab.internal&type=Primary&useSoaSerialDateScheme=false&primaryNameServerAddresses=&soaResponsibility=&refresh=0&retry=0&expire=0&minimumTtl=0&defaultTtl=0&disableNS1Soa=false"
curl -s -X POST "http://127.0.0.1:8118/api/zones/records/add?token=$TOKEN&domain=lab.internal&type=A&ipAddress=10.89.46.10&ttl=3600&comments="

实测回显(节选):

{"response":{"domain":"lab.internal"},"server":"dns-lab.internal","status":"ok"}
{"response":{"zone":{"name":"lab.internal","type":"Primary",...,"soaSerial":2,...},"addedRecord":{"name":"lab.internal","type":"A","ttl":3600,"ttlString":"1h",...,"rData":{"ipAddress":"10.89.46.10"},...}},"server":"dns-lab.internal","status":"ok"}

dig 验证权威回显与 SOA:

dig @127.0.0.1 -p 5300 lab.internal A +noall +answer +authority
dig @127.0.0.1 -p 5300 lab.internal SOA +noall +answer

实测回显:

lab.internal.           3600    IN      A       10.89.46.10
lab.internal.           900     IN      SOA     dns-lab.internal. hostadmin.lab.internal. 3 900 300 604800 900

三项验证全部通过,部署完成。

五、数据持久化说明

Technitium DNS 的全部状态集中在两个目录,均已 bind mount 到宿主:

宿主目录容器路径内容丢失后果
/opt/data/quzuo/technitium-dns/config/etc/dns全部配置(dns.config/auth.config 等)+ zones/ 权威 zone 数据 + blocklists/ 黑名单缓存 + stats/ 统计用户、zone、设置全丢,需重新初始化
/opt/data/quzuo/technitium-dns/logs/var/log/technitium/dns按天滚动的系统日志与查询日志(如 2026-10-19.log)历史日志丢失,不影响运行

实测确认落盘:

ls /opt/data/quzuo/technitium-dns/config/ && ls /opt/data/quzuo/technitium-dns/logs/

实测回显:

allowed.config  apps  auth.config  blocked.config  blocklist.config  blocklists  dns.config  log.config  scopes  stats  tls  webservice.config  zones
2026-10-19.log

持久化实证:第九节以等价 docker run 完全重建容器后,lab.internal zone、admin 密码、黑名单设置原样可用(dig 权威记录正常返回),证明状态全在宿主目录。备份即打包这两个目录:

tar czf technitium-dns-backup-$(date +%F).tar.gz -C /opt/data/quzuo/technitium-dns config logs

💡 说明:管理台自带的 Backup(Settings → Backup/Restore,zip 包)与 POST /api/settings/backup API 是官方推荐的配置备份通道,可选择性包含 zones/logs/stats;目录级 tar 适合整机迁移场景。两者可并存。

六、环境变量表

以下变量由官方文档 DockerEnvironmentVariables.md 定义,仅配置目录为空的首次启动读取一次,用于免交互初始化;已初始化后修改无效(需删除配置重来或改用管理台/API)。常用子集与本文取值:

环境变量本文取值说明
DNS_SERVER_DOMAINdns-lab.internal本机主 FQDN,写进 SOA/统计,全局标识
DNS_SERVER_ADMIN_PASSWORDq1w2e3r4Web 台 admin 初始密码;不带该变量时初始密码为 password(首次登录强制改)
DNS_SERVER_LOG_FOLDER_PATH/var/log/technitium/dns日志目录,官方 compose 默认值
DNS_SERVER_LOG_MAX_LOG_FILE_DAYS90日志保留天数,超期自动删除,0 为永久
DNS_SERVER_RECURSION(未设,默认 AllowOnlyForPrivateNetworks)递归策略:Allow/Deny/AllowOnlyForPrivateNetworks/UseSpecifiedNetworkACL
DNS_SERVER_FORWARDERS(未设)上游转发器,如 1.1.1.1, 8.8.8.8
DNS_SERVER_FORWARDER_PROTOCOL(未设,默认 Udp)转发协议:Udp/Tcp/Tls/Https/Quic
DNS_SERVER_ENABLE_BLOCKING(未设,默认 false,本文实测后经管理台开启)初始广告拦截开关
DNS_SERVER_BLOCK_LIST_URLS(未设)初始黑名单 URL,逗号分隔
DNS_SERVER_PREFER_IPV6(未设,默认 false)上游查询优先 IPv6
DNS_SERVER_WEB_SERVICE_HTTP_PORT(未设,默认 5380)Web 台 HTTP 端口
DNS_SERVER_OPTIONAL_PROTOCOL_DNS_OVER_HTTP(未设,默认 false)80/8053 端口开放 DoH 明文(反代终结 TLS 场景)

完整清单见官方 DockerEnvironmentVariables.md(含 SSO/LDAP/统计等 50+ 变量)。

七、配置参数说明

compose 中影响行为的关键参数逐项解读:

参数默认值本文值改动影响
container_name无(随机名)technitium-dns-15.6.2-server固定名便于 docker logs/exec 引用
hostname无dns-server容器内主机名,网络内解析标识
ports(53 组)官方 53:535300:53宿主 53 被 stub 占用,见 4.4 取舍
ports(Web 组)官方 5380:53808118:5380避开宿主已用端口;Web 台内部端口不变
DNS_SERVER_LOG_MAX_LOG_FILE_DAYS不清理90控制日志盘占用,D2 巡检依赖项
healthcheck.test(官方同款)同官方不健康时 STATUS 显示 unhealthy,供编排感知
restartnounless-stopped宿主重启后自动拉起(手动 stop 除外)
sysctls ip_local_port_range默认 32768-609991024 65535递归并发临时端口更多,与官方 compose 一致
networks.ipv4_address随机10.89.46.10固定 IP,便于条件转发/ACL 引用
networks.external自动创建technitium-dns-net复用 4.1 显式子网网络,避免随机网段风险

八、配置文件挂载说明

容器内只有两个有状态路径,其余(/opt/technitium/dns 程序目录)随镜像分发,无需挂载:

挂载方向说明
./config:/etc/dns宿主 → 容器核心配置。/etc/dns 是官方程序启动参数(Dockerfile CMD ["/etc/dns"]),容器内没有 /data/db 路径——网上旧资料按旧版镜像写的 /data/db/config 挂载对 15.x 无效
./logs:/var/log/technitium/dns宿主 → 容器日志目录,路径由 DNS_SERVER_LOG_FOLDER_PATH 声明

config 目录内文件用途(v15.6.2 实测观察,二进制序列化格式,均应通过管理台/API 修改而非手工编辑):

文件/目录用途
dns.configDNS 服务主配置(域名、监听、递归、缓存等)
auth.config用户与会话(admin 账号密码)
webservice.configWeb 管理台设置(监听地址、端口)
log.config日志设置
allowed.config / blocked.config / blocklist.config白名单/黑名单域与黑名单源配置
blocklists/黑名单下载缓存(sha256 命名文件,如 StevenBlack hosts 约 2.1 MB)
zones/权威 zone 文件(如 lab.internal.zone)
stats/Dashboard 统计数据
apps/DNS App 安装目录
scopes/DHCP 作用域(未启用 DHCP 时为空)
tls/DoT/DoH 证书(本文自签 PFX 存放处)

九、等价 docker run 形态

compose 配置完全等价的 docker run 命令(一条命令包含全部挂载/端口/环境变量/sysctl/固定 IP,已实测启动验证):

docker run -d \
  --name technitium-dns-15.6.2-server \
  --hostname dns-server \
  -p 8118:5380/tcp \
  -p 5300:53/udp \
  -p 5300:53/tcp \
  -p 8530:853/tcp \
  -p 9543:443/tcp \
  -p 9543:443/udp \
  -e DNS_SERVER_DOMAIN=dns-lab.internal \
  -e DNS_SERVER_ADMIN_PASSWORD=q1w2e3r4 \
  -e DNS_SERVER_LOG_FOLDER_PATH=/var/log/technitium/dns \
  -e DNS_SERVER_LOG_MAX_LOG_FILE_DAYS=90 \
  -v /opt/data/quzuo/technitium-dns/config:/etc/dns \
  -v /opt/data/quzuo/technitium-dns/logs:/var/log/technitium/dns \
  --sysctl "net.ipv4.ip_local_port_range=1024 65535" \
  --restart unless-stopped \
  --network technitium-dns-net \
  --ip 10.89.46.10 \
  technitium/dns-server:15.6.2

实测验证(先 docker compose down 再以等价 run 重建,复用同一份宿主数据):

dc85163ee84cb52bd6f47949a2f48019945d86a7879c19c8687993bd3bb9f253
docker ps --filter name=technitium-dns --format '{{.Names}} {{.Status}}'
technitium-dns-15.6.2-server Up 6 seconds

登录 API 与权威/递归解析全部正常(lab.internal 返回 3600 IN A 10.89.46.10,www.baidu.com 递归正常)——同时实证两点:① run 与 compose 形态完全等价;② 环境变量只在首次初始化生效,重建容器后凭宿主 config/ 目录即恢复全部状态。

⚠️ 注意:--sysctl 的值含空格,必须整体加引号,否则 65535 会被 docker 误解析为镜像名并报 Unable to find image '65535:latest'(实测踩坑)。

验证完切回 compose:docker rm -f technitium-dns-15.6.2-server && cd /opt/data/quzuo/technitium-dns && docker compose up -d。

十、常用运维命令

以下命令均在实测环境验证(保留 compose 项目目录为工作目录):

# 状态与健康(STATUS 列出现 healthy/unhealthy)
docker compose ps
NAME                           IMAGE                          COMMAND                   SERVICE      CREATED         STATUS                            PORTS
technitium-dns-15.6.2-server   technitium/dns-server:15.6.2   "/usr/bin/dotnet /op…"   dns-server   5 seconds ago   Up 5 seconds (health: starting)   67/udp, 80/tcp, 8053/tcp, 853/udp, 53443/tcp, 0.0.0.0:5300->53/tcp, ...
# 查看启动/运行日志(尾部)
docker compose logs --tail 3
technitium-dns-15.6.2-server  | Note: Open http://dns-server:5380 in web browser to access web console.
technitium-dns-15.6.2-server  |
technitium-dns-15.6.2-server  | Press [CTRL + C] to stop...
# 重启(配置文件级变更后使用;管理台内改动一般即时生效)
docker compose restart

# 停止 / 启动
docker compose down     # 移除容器,保留网络与宿主数据
docker compose up -d    # 重建启动

# 升级版本:改 compose 内 image tag(如 15.6.2 → 新版)后
docker compose pull && docker compose up -d

# 镜像核对
docker images technitium/dns-server --format '{{.Repository}}:{{.Tag}}  {{.ID}}  {{.Size}}'
technitium/dns-server:15.6.2  eb48ac5c135f  405MB
technitium/dns-server:latest  eb48ac5c135f  405MB
# 进容器排障(自带 dig/curl)
docker exec -it technitium-dns-15.6.2-server dig @127.0.0.1 localhost

# 健康检查 API(healthcheck 同源)
curl -s http://127.0.0.1:8118/api/dnsClient/healthCheck

实测回显:

{"status":"ok"}

十一、常见问题(FAQ)

Q1:启动报 failed to bind host port 0.0.0.0:53/tcp: address already in use? 宿主 53 被 systemd-resolved stub(127.0.0.53:53)或 dnsmasq 占用。处理见 4.4 节:专职 DNS 机选方案 A 释放 stub;共享环境选方案 B 映射高位端口(本文 5300)。先 ss -ltn | grep ':53 ' 判明占用者。

Q2:启动报 Bind for 0.0.0.0:8443 failed: port is already allocated? DoH 映射端口与其他服务冲突。本文实测即遇到(宿主 8443 被占),改映射 9543 后正常。报错原文:

Error response from daemon: failed to set up container networking: driver failed programming external connectivity on endpoint technitium-dns-15.6.2-server (10c65577b35e51faee4c319dfda2139afb7add912813106984ecce7732c57000): Bind for 0.0.0.0:8443 failed: port is already allocated

Q3:容器反复重启或 Web 打不开? 先看 docker compose logs --tail 50。若 STATUS 显示 unhealthy,进容器验证本地 API:docker exec technitium-dns-15.6.2-server curl -s http://127.0.0.1:5380/api/dnsClient/healthCheck;端口映射正常但外网不通时检查宿主防火墙/安全组对 5300/8118 的放行。

Q4:改了环境变量不生效? 环境变量只在配置目录为空的首次启动读取(官方文档明示)。已初始化的系统改 DNS_SERVER_ADMIN_PASSWORD 等无效,请在管理台改或删空 config/ 重新初始化(删空即丢全部数据,务必先备份)。

Q5:上游转发器配置后解析无答案? 测试环境对特定加密上游不可达(本文实测 1.1.1.1:853 DoT 转发无答案——该出口不可达),换成可达上游(如 223.5.5.5 + Tls)后恢复正常。判定方法:管理台切换上游后 dig @127.0.0.1 -p 5300 example.org,无答案即上游不可达,换 forwarderProtocol=Udp 的国内公共 DNS 对照定位。

Q6:DoT(853)/DoH(443) 端口通了但握手失败? 默认 enableDnsOverTls/Https=false 且无证书。需在管理台提供 PFX 证书(或自签)并启用后重启 DNS 服务生效(详见《Technitium DNS Server 15.6.2 配置详解》加密 DNS 章节)。

Q7:拉镜像慢/失败? 宿主 Docker 走代理:export http_proxy=http://192.168.1.62:7897 https_proxy=http://192.168.1.62:7897 后重试 docker compose pull(本机守护进程已预配代理,一般无需手动)。

十二、参考链接

  1. 官方 Docker 镜像:https://hub.docker.com/r/technitium/dns-server(查询日期 2026-10-19)
  2. 官方 docker-compose.yml 示例:https://github.com/TechnitiumSoftware/DnsServer/blob/master/docker-compose.yml(查询日期 2026-10-19)
  3. Docker 环境变量文档:https://github.com/TechnitiumSoftware/DnsServer/blob/master/DockerEnvironmentVariables.md(查询日期 2026-10-19)
  4. 官方 Dockerfile(配置目录 CMD ["/etc/dns"] 依据):https://github.com/TechnitiumSoftware/DnsServer/blob/master/Dockerfile(查询日期 2026-10-19)
  5. HTTP API 文档:https://github.com/TechnitiumSoftware/DnsServer/blob/master/APIDOCS.md(查询日期 2026-10-19)
  6. v15.6.2 Release:https://github.com/TechnitiumSoftware/DnsServer/releases/tag/v15.6.2(查询日期 2026-10-19)
  7. 系列文档:《Technitium DNS Server 15.6.2 介绍与选型指南》《Technitium DNS Server 15.6.2 配置详解》《Technitium DNS Server 日常运维与监控告警手册》