Files
ocdp-go/docs/deployment/docker-guide.md
mangomqy c5e51ed069 ocdp v1
2025-11-13 02:54:06 +00:00

9.2 KiB
Raw Permalink Blame History

🐳 Docker Compose 使用指南

完整的 Docker Compose 配置,一键启动所有服务!

📋 服务列表

核心服务(默认启动)

服务 端口 说明
postgres 5432 PostgreSQL 16 数据库
redis 6379 Redis 缓存(可选)
backend 8080 Go 后端 API 服务
frontend 3000 React 前端应用

可选服务

服务 端口 说明 Profile
nginx 80, 443 反向代理 production
pgadmin 5050 PostgreSQL 管理工具 tools
swagger-ui 8081 API 文档查看器 tools

🚀 快速开始

1. 生产环境启动

# 启动核心服务PostgreSQL + Redis + Backend + Frontend
docker compose up -d

# 查看日志
docker compose logs -f

# 查看服务状态
docker compose ps

访问:

2. 开发环境启动(支持热重载)

# 使用开发配置启动
docker compose -f docker-compose.yml -f docker-compose.dev.yml up

# 或使用 Makefile 命令
make docker-dev

开发模式特性:

  • 后端支持热重载(使用 Air
  • 前端支持热重载Vite
  • 自动挂载源代码
  • 使用 Mock 模式(无需真实数据)

3. 启动可选工具

# 启动 pgAdmin
docker compose --profile tools up -d pgadmin

# 启动 Swagger UI
docker compose --profile tools up -d swagger-ui

# 启动所有工具
docker compose --profile tools up -d

# 启动生产环境(包含 Nginx
docker compose --profile production up -d

访问工具:

📚 常用命令

服务管理

# 启动所有服务
docker compose up -d

# 启动特定服务
docker compose up -d postgres redis backend

# 停止所有服务
docker compose down

# 停止并删除数据卷
docker compose down -v

# 重启服务
docker compose restart

# 重启特定服务
docker compose restart backend

日志查看

# 查看所有服务日志
docker compose logs -f

# 查看特定服务日志
docker compose logs -f backend

# 查看最近100行日志
docker compose logs --tail=100 backend

# 实时查看日志(带时间戳)
docker compose logs -f --timestamps backend

服务状态

# 查看服务状态
docker compose ps

# 查看服务详细信息
docker compose ps -a

# 查看服务资源使用
docker stats

进入容器

# 进入后端容器
docker compose exec backend sh

# 进入 PostgreSQL 容器
docker compose exec postgres psql -U postgres -d ocdp

# 进入 Redis 容器
docker compose exec redis redis-cli

构建和更新

# 重新构建镜像
docker compose build

# 重新构建特定服务
docker compose build backend

# 强制重新构建(不使用缓存)
docker compose build --no-cache

# 拉取最新镜像
docker compose pull

🔧 配置说明

环境变量

  1. 复制环境变量示例文件:
cp env.example .env
  1. 编辑 .env 文件,修改必要的配置:
# 修改 JWT 密钥(生产环境必须修改)
JWT_SECRET=your-very-secure-secret-key

# 修改数据库密码(生产环境建议修改)
DB_PASSWORD=your-secure-password

数据持久化

数据卷:

  • postgres_data - PostgreSQL 数据
  • redis_data - Redis 数据
  • backend_data - 后端应用数据
  • pgadmin_data - pgAdmin 配置
  • nginx_logs - Nginx 日志

查看数据卷:

docker volume ls | grep ocdp

备份数据卷:

# 备份 PostgreSQL
docker compose exec postgres pg_dump -U postgres ocdp > backup.sql

# 或使用 Docker 卷备份
docker run --rm -v ocdp-go_postgres_data:/data -v $(pwd):/backup alpine tar czf /backup/postgres-backup.tar.gz -C /data .

恢复数据:

# 恢复 PostgreSQL
docker compose exec -T postgres psql -U postgres ocdp < backup.sql

# 或恢复卷
docker run --rm -v ocdp-go_postgres_data:/data -v $(pwd):/backup alpine tar xzf /backup/postgres-backup.tar.gz -C /data

🏗️ 服务架构

┌─────────────┐
│   Client    │
└──────┬──────┘
       │
       ↓
┌─────────────┐      ┌─────────────┐
│   Nginx     │      │  Swagger UI │
│   (80)      │      │   (8081)    │
└──────┬──────┘      └─────────────┘
       │
       ↓
┌─────────────┐
│  Frontend   │
│   (3000)    │
└──────┬──────┘
       │
       ↓
┌─────────────┐
│   Backend   │
│   (8080)    │
└──┬────┬─────┘
   │    │
   │    └─────────┐
   ↓              ↓
┌─────────┐  ┌─────────┐
│Postgres │  │  Redis  │
│ (5432)  │  │ (6379)  │
└────┬────┘  └─────────┘
     │
     ↓
┌─────────┐
│pgAdmin  │
│ (5050)  │
└─────────┘

🔍 健康检查

所有服务都配置了健康检查:

# 检查所有服务健康状态
docker compose ps

# 检查特定服务
curl http://localhost:8080/health  # Backend
curl http://localhost:3000/health  # Frontend

健康状态说明:

  • healthy - 服务正常运行
  • starting - 服务正在启动
  • unhealthy - 服务异常

🐛 故障排查

问题 1: 端口冲突

错误port is already allocated

解决方案

# 查看端口占用
lsof -i :8080

# 修改 docker-compose.yml 中的端口映射(如需更改)
ports:
  - "8081:8080"  # 将主机端口改为 8081

问题 2: 数据库连接失败

错误connection refused

解决方案

# 1. 检查 PostgreSQL 是否启动
docker compose ps postgres

# 2. 查看 PostgreSQL 日志
docker compose logs postgres

# 3. 等待健康检查通过
docker compose ps | grep healthy

# 4. 手动测试连接
docker compose exec postgres psql -U postgres -d ocdp

问题 3: 构建失败

错误build failed

解决方案

# 1. 清理旧的镜像和容器
docker compose down -v
docker system prune -a

# 2. 重新构建(不使用缓存)
docker compose build --no-cache

# 3. 检查 Dockerfile 和 .dockerignore

问题 4: 容器不断重启

解决方案

# 查看容器日志
docker compose logs --tail=100 [service-name]

# 检查健康检查状态
docker inspect ocdp-backend | grep -A 20 Health

# 禁用健康检查测试
# 在 docker-compose.yml 中注释掉 healthcheck 部分

问题 5: 数据持久化失败

解决方案

# 检查数据卷
docker volume ls
docker volume inspect ocdp-go_postgres_data

# 检查挂载权限
docker compose exec postgres ls -la /var/lib/postgresql/data

🔒 安全建议

生产环境

  1. 修改默认密码
# .env 文件中
DB_PASSWORD=your-secure-password
JWT_SECRET=your-very-secure-secret-key
  1. 使用 secrets
# docker-compose.yml
secrets:
  db_password:
    file: ./secrets/db_password.txt
  1. 限制容器权限
services:
  backend:
    security_opt:
      - no-new-privileges:true
    cap_drop:
      - ALL
    cap_add:
      - NET_BIND_SERVICE
  1. 使用专用网络
networks:
  frontend:
    driver: bridge
  backend:
    driver: bridge
    internal: true  # 不能访问外网

📊 监控和日志

日志聚合

# 使用 ELK Stack
docker compose -f docker-compose.yml -f docker-compose.logging.yml up -d

# 或使用 Loki
docker compose -f docker-compose.yml -f docker-compose.loki.yml up -d

性能监控

# 查看资源使用
docker stats

# 限制资源使用
services:
  backend:
    deploy:
      resources:
        limits:
          cpus: '1'
          memory: 512M
        reservations:
          cpus: '0.5'
          memory: 256M

🎯 最佳实践

  1. 使用多阶段构建 - 减小镜像大小
  2. 配置健康检查 - 确保服务可用性
  3. 使用 .dockerignore - 排除不必要的文件
  4. 使用非 root 用户 - 提高安全性
  5. 配置日志驱动 - 集中管理日志
  6. 使用 depends_on 和 healthcheck - 确保启动顺序
  7. 使用 profiles - 按需启动服务

🔗 相关命令Makefile

项目 Makefile 已集成 Docker Compose 命令:

make docker-up        # 启动所有服务
make docker-down      # 停止所有服务
make docker-logs      # 查看日志
make docker-dev       # 开发模式启动
make docker-build     # 重新构建镜像

📚 更多资源


提示: 首次启动可能需要几分钟来下载镜像和构建容器,请耐心等待!

有问题?查看日志:docker compose logs -f