Skip to content

Docker 部署

本文档介绍如何使用 Docker 部署 DNS-Go 服务。

前置条件

  • 安装 Docker 20.10+
  • 了解基本的 Docker 操作
  • 已完成环境要求检查

快速开始

1. 拉取镜像

bash
# 从腾讯云镜像仓库拉取
docker pull ccr.ccs.tencentyun.com/liumou/dns-go:latest

# 或从其他镜像源
docker pull liumou/dns-go:latest

2. 准备配置文件

创建配置目录和配置文件:

bash
mkdir -p /opt/dns-go/config
mkdir -p /opt/dns-go/data
mkdir -p /opt/dns-go/logs

# 下载配置文件模板
curl -o /opt/dns-go/config/config.toml \
  https://gitee.com/liumou_site/dns-go/raw/master/vitepress/public/config.example.toml

编辑配置文件:

bash
vim /opt/dns-go/config/config.toml

修改以下关键配置:

toml
[database]
driver = "postgres"
host = "your-db-host"      # 数据库主机地址
port = 5432
username = "dnsgo"
password = "your_secure_password"  # 修改密码
database = "dns_go"

[jwt]
secret_key = "your_jwt_secret_key_min_32_chars"  # 修改密钥
expires_in = 24

[valkey]
ip = "your-cache-host"   # 缓存主机地址
port = 6379
password = ""

3. 运行容器

bash
docker run -d \
  --name dns-go \
  --restart unless-stopped \
  -p 8085:8085 \
  -p 53:53/udp \
  -p 53:53/tcp \
  -v /opt/dns-go/config:/app/config \
  -v /opt/dns-go/data:/app/data \
  -v /opt/dns-go/logs:/app/logs \
  -e DB_HOST=your-db-host \
  -e DB_PORT=5432 \
  -e DB_USER=dnsgo \
  -e DB_PASSWORD=your_password \
  -e DB_NAME=dns_go \
  ccr.ccs.tencentyun.com/liumou/dns-go:latest

4. 验证部署

bash
# 查看容器状态
docker ps | grep dns-go

# 查看日志
docker logs -f dns-go

# 访问 Web 界面
open http://localhost:8085

默认账号:admin / admin123

高级配置

使用 Docker Network

创建专用网络,与其他服务通信:

bash
# 创建网络
docker network create dns-go-network

# 运行容器
docker run -d \
  --name dns-go \
  --network dns-go-network \
  -p 8085:8085 \
  -p 53:53/udp \
  -p 53:53/tcp \
  -v /opt/dns-go/config:/app/config \
  ccr.ccs.tencentyun.com/liumou/dns-go:latest

环境变量配置

支持通过环境变量覆盖配置文件:

环境变量说明示例
DB_HOST数据库主机postgres
DB_PORT数据库端口5432
DB_USER数据库用户dnsgo
DB_PASSWORD数据库密码your_password
DB_NAME数据库名称dns_go
CACHE_HOST缓存主机valkey
CACHE_PORT缓存端口6379
CACHE_PASSWORD缓存密码``
JWT_SECRET_KEYJWT 密钥your_secret

资源限制

限制容器资源使用:

bash
docker run -d \
  --name dns-go \
  --memory=512m \
  --memory-swap=1g \
  --cpus=1.0 \
  -p 8085:8085 \
  -p 53:53/udp \
  -p 53:53/tcp \
  ccr.ccs.tencentyun.com/liumou/dns-go:latest

健康检查

配置容器健康检查:

bash
docker run -d \
  --name dns-go \
  --health-cmd="curl -f http://localhost:8085/api/health || exit 1" \
  --health-interval=30s \
  --health-timeout=10s \
  --health-retries=3 \
  --health-start-period=40s \
  ccr.ccs.tencentyun.com/liumou/dns-go:latest

常用操作

查看日志

bash
# 实时查看日志
docker logs -f dns-go

# 查看最近 100 行
docker logs --tail 100 dns-go

# 查看特定时间段的日志
docker logs --since "2025-01-15T10:00:00" dns-go

进入容器

bash
# 进入容器 shell
docker exec -it dns-go /bin/sh

# 查看配置文件
docker exec dns-go cat /app/config/config.toml

重启服务

bash
# 重启容器
docker restart dns-go

# 停止容器
docker stop dns-go

# 启动容器
docker start dns-go

更新版本

bash
# 1. 拉取最新镜像
docker pull ccr.ccs.tencentyun.com/liumou/dns-go:latest

# 2. 停止旧容器
docker stop dns-go

# 3. 备份数据(可选)
cp -r /opt/dns-go/data /opt/dns-go/data.backup

# 4. 删除旧容器
docker rm dns-go

# 5. 运行新容器
docker run -d \
  --name dns-go \
  --restart unless-stopped \
  -p 8085:8085 \
  -p 53:53/udp \
  -p 53:53/tcp \
  -v /opt/dns-go/config:/app/config \
  -v /opt/dns-go/data:/app/data \
  -v /opt/dns-go/logs:/app/logs \
  ccr.ccs.tencentyun.com/liumou/dns-go:latest

# 6. 验证新版本
docker logs dns-go

备份和恢复

备份:

bash
# 备份配置文件
cp -r /opt/dns-go/config /backup/dns-go-config-$(date +%Y%m%d)

# 备份数据目录
cp -r /opt/dns-go/data /backup/dns-go-data-$(date +%Y%m%d)

# 备份数据库(如果数据库也是容器)
docker exec postgres pg_dump -U dnsgo dns_go > /backup/dns-go-db-$(date +%Y%m%d).sql

恢复:

bash
# 恢复配置文件
cp -r /backup/dns-go-config-20250115 /opt/dns-go/config

# 恢复数据目录
cp -r /backup/dns-go-data-20250115 /opt/dns-go/data

# 恢复数据库
docker exec -i postgres psql -U dnsgo dns_go < /backup/dns-go-db-20250115.sql

# 重启容器
docker restart dns-go

多容器部署

与 PostgreSQL 容器一起部署

bash
# 创建网络
docker network create dns-go-network

# 运行 PostgreSQL
docker run -d \
  --name postgres \
  --network dns-go-network \
  -e POSTGRES_USER=dnsgo \
  -e POSTGRES_PASSWORD=your_password \
  -e POSTGRES_DB=dns_go \
  -v /opt/postgres/data:/var/lib/postgresql/data \
  postgres:16-alpine

# 运行 DNS-Go
docker run -d \
  --name dns-go \
  --network dns-go-network \
  -p 8085:8085 \
  -p 53:53/udp \
  -p 53:53/tcp \
  -e DB_HOST=postgres \
  -e DB_PASSWORD=your_password \
  ccr.ccs.tencentyun.com/liumou/dns-go:latest

与 Valkey 容器一起部署

bash
# 运行 Valkey
docker run -d \
  --name valkey \
  --network dns-go-network \
  -v /opt/valkey/data:/data \
  valkey/valkey:8-alpine

# 运行 DNS-Go(连接到 PostgreSQL 和 Valkey)
docker run -d \
  --name dns-go \
  --network dns-go-network \
  -p 8085:8085 \
  -p 53:53/udp \
  -p 53:53/tcp \
  -e DB_HOST=postgres \
  -e DB_PASSWORD=your_password \
  -e CACHE_HOST=valkey \
  ccr.ccs.tencentyun.com/liumou/dns-go:latest

故障排查

容器无法启动

bash
# 查看容器日志
docker logs dns-go

# 检查端口占用
sudo netstat -tlnp | grep -E '8085|53'

# 检查配置文件
docker exec dns-go cat /app/config/config.toml

数据库连接失败

bash
# 检查数据库容器状态
docker ps | grep postgres

# 测试数据库连接
docker exec dns-go nc -zv postgres 5432

# 查看数据库日志
docker logs postgres

53 端口绑定失败

bash
# 检查宿主机 53 端口占用
sudo lsof -i :53

# 如果 systemd-resolved 占用,停止它
sudo systemctl stop systemd-resolved

# 或使用特权模式运行
docker run -d --privileged ...

相关文档

基于 MIT 许可发布