Technitium DNS Server Docker Compose 部署指南
Technitium DNS Server 15.6.2 Docker Compose 单容器部署指南:官方镜像选型、5300 高位端口映射取舍(systemd-resolved 占用 53 实录)、显式子网网络、持久化、环境变量表、等价 docker run 与运维命令,含登录、递归解析与本地权威 zone 实测回显。
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 IDeb48ac5c135f) - 部署目录:
/opt/data/quzuo/technitium-dns/(compose 文件 + 持久化数据) - 容器名:
technitium-dns-15.6.2-server - 专用网络:
technitium-dns-net,显式子网10.89.46.0/24,容器固定 IP10.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作为配置目录参数(DockerfileCMD ["/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/backupAPI 是官方推荐的配置备份通道,可选择性包含 zones/logs/stats;目录级 tar 适合整机迁移场景。两者可并存。
六、环境变量表
以下变量由官方文档 DockerEnvironmentVariables.md 定义,仅配置目录为空的首次启动读取一次,用于免交互初始化;已初始化后修改无效(需删除配置重来或改用管理台/API)。常用子集与本文取值:
| 环境变量 | 本文取值 | 说明 |
|---|---|---|
DNS_SERVER_DOMAIN | dns-lab.internal | 本机主 FQDN,写进 SOA/统计,全局标识 |
DNS_SERVER_ADMIN_PASSWORD | q1w2e3r4 | Web 台 admin 初始密码;不带该变量时初始密码为 password(首次登录强制改) |
DNS_SERVER_LOG_FOLDER_PATH | /var/log/technitium/dns | 日志目录,官方 compose 默认值 |
DNS_SERVER_LOG_MAX_LOG_FILE_DAYS | 90 | 日志保留天数,超期自动删除,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:53 | 5300:53 | 宿主 53 被 stub 占用,见 4.4 取舍 |
ports(Web 组) | 官方 5380:5380 | 8118:5380 | 避开宿主已用端口;Web 台内部端口不变 |
DNS_SERVER_LOG_MAX_LOG_FILE_DAYS | 不清理 | 90 | 控制日志盘占用,D2 巡检依赖项 |
healthcheck.test | (官方同款) | 同官方 | 不健康时 STATUS 显示 unhealthy,供编排感知 |
restart | no | unless-stopped | 宿主重启后自动拉起(手动 stop 除外) |
sysctls ip_local_port_range | 默认 32768-60999 | 1024 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.config | DNS 服务主配置(域名、监听、递归、缓存等) |
auth.config | 用户与会话(admin 账号密码) |
webservice.config | Web 管理台设置(监听地址、端口) |
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(本机守护进程已预配代理,一般无需手动)。
十二、参考链接
- 官方 Docker 镜像:https://hub.docker.com/r/technitium/dns-server(查询日期 2026-10-19)
- 官方 docker-compose.yml 示例:https://github.com/TechnitiumSoftware/DnsServer/blob/master/docker-compose.yml(查询日期 2026-10-19)
- Docker 环境变量文档:https://github.com/TechnitiumSoftware/DnsServer/blob/master/DockerEnvironmentVariables.md(查询日期 2026-10-19)
- 官方 Dockerfile(配置目录 CMD ["/etc/dns"] 依据):https://github.com/TechnitiumSoftware/DnsServer/blob/master/Dockerfile(查询日期 2026-10-19)
- HTTP API 文档:https://github.com/TechnitiumSoftware/DnsServer/blob/master/APIDOCS.md(查询日期 2026-10-19)
- v15.6.2 Release:https://github.com/TechnitiumSoftware/DnsServer/releases/tag/v15.6.2(查询日期 2026-10-19)
- 系列文档:《Technitium DNS Server 15.6.2 介绍与选型指南》《Technitium DNS Server 15.6.2 配置详解》《Technitium DNS Server 日常运维与监控告警手册》