Docker 部署指南¶
本指南说明如何使用 Docker 和 Docker Compose 部署 Shortener 服务器。
快速开始¶
开发环境(SQLite + Redis)¶
# 构建并运行
docker compose -f docker/docker-compose.dev.yml up -d
# 查看日志
docker compose -f docker/docker-compose.dev.yml logs -f
# 停止
docker compose -f docker/docker-compose.dev.yml down
生产环境(PostgreSQL + Redis)¶
# 构建并运行
docker compose -f docker/docker-compose.yml up -d
# 查看日志
docker compose -f docker/docker-compose.yml logs -f
# 停止
docker compose -f docker/docker-compose.yml down
Docker 镜像¶
标准镜像(基于 Debian)¶
- 基础镜像:
debian:trixie-slim - 大小:约 150MB
- 适用于:通用场景,兼容性好
Alpine 镜像(更小)¶
- 基础镜像:
alpine:3.19 - 大小:约 50MB
- 适用于:生产环境,最小化占用
使用 Docker Bake¶
Docker Bake 提供了更强大的构建配置。
本地构建¶
# 构建默认镜像
docker buildx bake
# 构建开发镜像(amd64)
docker buildx bake dev-amd64
# 构建开发镜像(arm64)
docker buildx bake dev-arm64
# 构建所有开发镜像
docker buildx bake dev
发布构建¶
自定义构建¶
# 使用自定义标签
docker buildx bake --set "*.tags=myregistry/shortener:v1.0.0"
# 推送到仓库
docker buildx bake --push release
# 设置平台
docker buildx bake --set "*.platform=linux/amd64,linux/arm64,linux/arm/v7"
配置¶
环境变量¶
可以在 docker-compose.yml 中设置以下环境变量:
服务器配置¶
RUST_LOG:日志级别(debug、info、warn、error)CONFIG_PATH:配置文件路径(默认:/app/config.toml)
数据库配置¶
DATABASE_TYPE:数据库类型(sqlite、postgres、mysql)DATABASE_HOST:数据库主机DATABASE_PORT:数据库端口DATABASE_NAME:数据库名称DATABASE_USER:数据库用户DATABASE_PASSWORD:数据库密码DATABASE_PATH:SQLite 数据库路径
缓存配置¶
CACHE_ENABLED:启用缓存(true/false)CACHE_TYPE:缓存类型(redis、valkey)CACHE_HOST:缓存主机CACHE_PORT:缓存端口CACHE_PASSWORD:缓存密码
GeoIP 配置¶
GEOIP_ENABLED:启用 GeoIP(true/false)GEOIP_DB_PATH:ip2region 数据库路径
卷挂载¶
volumes:
- ../config/config.docker.toml:/app/config.toml:ro # 配置文件
- ../data:/app/data # 数据文件(数据库、GeoIP等)
- app-logs:/app/logs # 日志
Makefile 命令¶
从项目根目录运行:
# 构建镜像
make build # Debian 版本
make build-alpine # Alpine 版本
# 运行服务
make run # 生产环境(PostgreSQL)
make run-dev # 开发环境(SQLite)
make run-mysql # 生产环境(MySQL)
# 管理服务
make stop # 停止所有容器
make clean # 删除容器和卷
make logs # 查看所有日志
make logs-server # 仅查看服务器日志
# 测试
make test # 在 Docker 中运行测试
# 推送到仓库
make docker-push REGISTRY=docker.io/yourusername TAG=v1.0.0
Just 命令¶
或者使用 just 命令(从项目根目录运行):
# 构建镜像
just docker-build # Debian 版本
just docker-build-alpine # Alpine 版本
# 运行服务
just docker-run # 生产环境(PostgreSQL)
just docker-run-dev # 开发环境(SQLite)
# 管理服务
just docker-stop # 停止所有容器
just docker-logs # 查看日志
健康检查¶
服务器包含健康检查:
healthcheck:
test: ["CMD", "curl", "-f", "http://localhost:8080/health"]
interval: 30s
timeout: 3s
retries: 3
start_period: 10s
网络¶
所有服务运行在自定义桥接网络 shortener-network 中:
服务可以使用服务名称相互通信:
shortener-server:主应用postgres:PostgreSQL 数据库mysql:MySQL 数据库redis:Redis 缓存
数据持久化¶
使用 Docker 卷持久化数据:
postgres-data:PostgreSQL 数据mysql-data:MySQL 数据redis-data:Redis 数据app-logs:应用日志/app/data:应用数据(SQLite 数据库、GeoIP 数据库等)
安全考虑¶
非 root 用户¶
容器以非 root 用户运行(shortener,UID 1000):
密钥管理¶
生产环境使用 Docker secrets 或环境文件:
# 创建 .env 文件
cat > .env << EOF
DATABASE_PASSWORD=your_secure_password
CACHE_PASSWORD=your_redis_password
API_KEY=your_api_key
EOF
# 使用 docker compose
docker compose --env-file .env up -d
网络隔离¶
仅暴露必要的端口:
生产环境不应暴露数据库和缓存端口。
故障排除¶
查看日志¶
# 所有服务
docker compose -f docker/docker-compose.yml logs -f
# 特定服务
docker compose -f docker/docker-compose.yml logs -f shortener-server
docker compose -f docker/docker-compose.yml logs -f postgres
docker compose -f docker/docker-compose.yml logs -f redis
检查容器状态¶
在容器中执行命令¶
# Shell 访问
docker compose -f docker/docker-compose.yml exec shortener-server sh
# 检查配置
docker compose -f docker/docker-compose.yml exec shortener-server cat /app/config.toml
# 检查数据库连接
docker compose -f docker/docker-compose.yml exec postgres psql -U shortener -d shortener
更改后重新构建¶
# 重新构建并重启
docker compose -f docker/docker-compose.yml up -d --build
# 强制重新创建
docker compose -f docker/docker-compose.yml up -d --force-recreate
清理¶
# 停止并删除容器
docker compose -f docker/docker-compose.yml down
# 同时删除卷
docker compose -f docker/docker-compose.yml down -v
# 删除所有未使用的 Docker 资源
docker system prune -a
生产部署¶
1. 准备配置¶
2. 设置环境变量¶
# 创建生产环境文件
cat > .env.production << EOF
RUST_LOG=info
DATABASE_TYPE=postgres
DATABASE_HOST=postgres
DATABASE_PORT=5432
DATABASE_NAME=shortener
DATABASE_USER=shortener
DATABASE_PASSWORD=$(openssl rand -base64 32)
CACHE_ENABLED=true
CACHE_TYPE=redis
CACHE_HOST=redis
CACHE_PORT=6379
CACHE_PASSWORD=$(openssl rand -base64 32)
API_KEY=$(openssl rand -base64 32)
EOF
3. 部署¶
# 构建并启动
docker compose -f docker/docker-compose.yml --env-file .env.production up -d
# 验证
docker compose -f docker/docker-compose.yml ps
docker compose -f docker/docker-compose.yml logs -f shortener-server
4. 备份¶
# 备份 PostgreSQL
docker compose -f docker/docker-compose.yml exec postgres pg_dump -U shortener shortener > backup.sql
# 备份卷
docker run --rm -v shortener_postgres-data:/data -v $(pwd):/backup \
alpine tar czf /backup/postgres-backup.tar.gz /data