这是一个已打包好的 mosdns Docker 镜像,适合直接用 Docker Compose 部署为局域网 DNS 服务。
镜像:
rsg2019/mosdns:v5.3.4
创建目录:
mkdir -p /opt/mosdns/config /opt/mosdns/rules
cd /opt/mosdns
创建 docker-compose.yml:
services:
mosdns:
image: rsg2019/mosdns:v5.3.4
container_name: mosdns
restart: unless-stopped
ports:
- "${MOSDNS_LISTEN_PORT:-53}:53/udp"
- "${MOSDNS_LISTEN_PORT:-53}:53/tcp"
environment:
TZ: ${TZ:-Asia/Shanghai}
DOMESTIC_DNS_1: ${DOMESTIC_DNS_1:-223.5.5.5}
DOMESTIC_DNS_2: ${DOMESTIC_DNS_2:-119.29.29.29}
DOMESTIC_DNS_3: ${DOMESTIC_DNS_3:-202.102.134.68}
FOREIGN_DNS: ${FOREIGN_DNS:-192.168.1.54:53}
ECS_IPV4_PREFIX: ${ECS_IPV4_PREFIX:-24}
ECS_IPV6_PREFIX: ${ECS_IPV6_PREFIX:-56}
ECS_PRESET: ${ECS_PRESET:-}
ECS_AUTO_IP: ${ECS_AUTO_IP:-1}
ECS_IP_SERVICES: ${ECS_IP_SERVICES:-https://4.ipw.cn http://ip.3322.net https://myip.ipip.net}
ECS_IP_DNS: ${ECS_IP_DNS:-223.5.5.5 119.29.29.29 202.102.134.68}
CACHE_SIZE: ${CACHE_SIZE:-8192}
CACHE_LAZY_TTL: ${CACHE_LAZY_TTL:-0}
CACHE_DUMP_FILE: ${CACHE_DUMP_FILE:-}
CACHE_DUMP_INTERVAL: ${CACHE_DUMP_INTERVAL:-300}
UPDATE_SCHEDULE: ${UPDATE_SCHEDULE:-30 3 * * *}
RELOAD_MOSDNS: ${RELOAD_MOSDNS:-1}
volumes:
- ./config:/etc/mosdns/config:ro
- ./rules:/etc/mosdns/rules:rw
- mosdns-cache:/var/cache/mosdns
healthcheck:
test: ["CMD-SHELL", "pidof mosdns >/dev/null && netstat -lun | grep -q ':53 '"]
interval: 30s
timeout: 5s
retries: 3
start_period: 20s
volumes:
mosdns-cache:
启动:
docker compose up -d
查看状态:
docker ps --filter name=mosdns
docker logs --tail 100 mosdns
测试解析:
dig @127.0.0.1 baidu.com A +short
dig @127.0.0.1 wikipedia.org A +short
默认监听宿主机:
53/udp
53/tcp
如果宿主机 53 端口已被占用:
MOSDNS_LISTEN_PORT=1053 docker compose up -d
测试:
dig @127.0.0.1 -p 1053 baidu.com A +short
默认:
DOMESTIC_DNS_1=223.5.5.5
DOMESTIC_DNS_2=119.29.29.29
DOMESTIC_DNS_3=202.102.134.68
建议把 DOMESTIC_DNS_3 改成你本地运营商 DNS。
默认:
FOREIGN_DNS=192.168.1.54:53
这要求局域网内 192.168.1.54 的 mihomo DNS 正常监听 53 端口。
如果你的 mihomo 地址不同,改成:
FOREIGN_DNS=你的mihomo地址:端口
默认自动获取公网 IPv4:
ECS_PRESET=
ECS_AUTO_IP=1
容器启动时会请求国内 IP 回显服务:
ECS_IP_SERVICES=https://4.ipw.cn http://ip.3322.net https://myip.ipip.net
并使用国内 DNS 解析这些服务:
ECS_IP_DNS=223.5.5.5 119.29.29.29 202.102.134.68
请求时会禁用代理,避免拿到代理节点 IP。每次容器启动都会重新获取 ECS IP。公网 IP 变化后,重启容器即可刷新:
docker restart mosdns
如果要固定 ECS IP:
ECS_PRESET=你的公网IPv4
ECS_AUTO_IP=0
默认:
CACHE_SIZE=8192
CACHE_LAZY_TTL=0
CACHE_DUMP_FILE=
CACHE_DUMP_INTERVAL=300
含义:
CACHE_SIZE=8192:缓存容量CACHE_LAZY_TTL=0:禁用过期缓存兜底CACHE_DUMP_FILE=:不持久化缓存到磁盘CACHE_DUMP_INTERVAL=300:保留参数,未设置 dump 文件时不会持久化旧缓存默认每天凌晨 03:30 更新规则:
UPDATE_SCHEDULE=30 3 * * *
更新成功后自动重启 mosdns:
RELOAD_MOSDNS=1
手动更新:
docker exec mosdns /usr/local/bin/update-rules-and-restart.sh
只更新不重启:
docker exec mosdns sh -c 'RELOAD_MOSDNS=0 /usr/local/bin/update-rules-and-restart.sh'
国内域名:
./config/domestic_domains.txt
国外域名:
./config/foreign_domains.txt
国内 IP:
./config/domestic_ip.txt
国外 IP:
./config/foreign_ip.txt
修改后重启:
docker restart mosdns
查看日志:
docker logs -f mosdns
查看最终运行配置:
docker exec mosdns cat /tmp/mosdns-runtime/config.yaml
查看 ECS:
docker exec mosdns sh -c 'grep -A8 -n "tag: ecs_cn" /tmp/mosdns-runtime/config.yaml'
查看版本:
docker exec mosdns /usr/local/bin/mosdns version
重启:
docker restart mosdns
停止:
docker compose down
容器启动失败:
docker logs --tail 200 mosdns
国外域名无法解析:
dig @192.168.1.54 google.com A +short
如果这个命令失败,说明 mihomo DNS 入口不可达或未监听。
ECS IP 不对:
docker logs mosdns | grep 'detected ECS'
docker exec mosdns sh -c 'grep -A8 -n "tag: ecs_cn" /tmp/mosdns-runtime/config.yaml'
如果仍然拿到代理节点 IP,检查宿主机或 Docker 网络出口是否被透明代理影响。可以临时固定:
ECS_PRESET=真实公网IPv4
ECS_AUTO_IP=0
Content type
Image
Digest
sha256:05f9881ca…
Size
14.6 MB
Last updated
3 months ago
docker pull rsg2019/mosdns