Docker 交付与在线升级方案
一、总体架构设计
1.1 容器化策略
-
应用镜像:为 FastAPI 主应用构建独立 Docker 镜像
-
服务编排:使用 Docker Compose 编排所有服务
-
数据持久化:数据库、配置文件、日志等使用 Volume 持久化
-
多环境支持:开发、测试、生产环境使用不同的 Compose 文件
1.2 版本管理策略
-
镜像标签:使用语义化版本(如
v1.0.0)和 Git Commit SHA(如v1.0.0-abc1234) -
版本标识:在镜像内记录版本信息,便于运行时查询
-
回滚机制:保留历史镜像,支持快速回滚
二、Docker 文件结构规划
aixx/
├── docker/
│ ├── compose.yml # 开发环境(已有)
│ ├── compose.prod.yml # 生产环境编排文件(新建)
│ ├── Dockerfile # 应用镜像构建文件(新建)
│ ├── Dockerfile.multi-stage # 多阶段构建优化版(可选)
│ ├── .dockerignore # Docker 构建忽略文件(新建)
│ ├── docker-entrypoint.sh # 容器启动脚本(新建)
│ ├── upgrade.sh # 升级脚本(新建)
│ └── healthcheck.sh # 健康检查脚本(新建)
├── deployment/
│ ├── docker-compose.prod.yml # 客户交付用生产配置(新建)
│ ├── .env.example # 环境变量模板(新建)
│ ├── upgrade/ # 升级相关脚本
│ │ ├── upgrade.sh # 主升级脚本
│ │ ├── rollback.sh # 回滚脚本
│ │ └── check-version.sh # 版本检查脚本
│ └── scripts/ # 部署辅助脚本
│ ├── init.sh # 初始化脚本
│ └── backup.sh # 备份脚本
└── docker/
└── [现有文件保持不变]
三、具体实施方案
3.1 Dockerfile 设计要点
-
基础镜像:使用 Python 3.11 slim 镜像
-
构建优化:
-
多阶段构建减少镜像体积
-
使用 uv 进行依赖安装
-
分层缓存优化(依赖与代码分离)
-
-
安全:
-
非 root 用户运行
-
最小权限原则
-
-
版本注入:构建时注入版本信息到镜像
3.2 Docker Compose 生产配置要点
-
网络:使用自定义网络隔离
-
健康检查:所有服务配置健康检查
-
资源限制:CPU、内存限制
-
重启策略:
restart: unless-stopped -
环境变量:敏感信息通过
.env文件管理 -
数据卷:
-
PostgreSQL 数据持久化
-
日志目录挂载
-
CubeJS 配置持久化
-
3.3 在线升级机制
升级流程设计:
1. 版本检查
├─ 检查当前版本
├─ 检查可用新版本
└─ 检查升级路径兼容性
2. 备份阶段
├─ 数据库备份
├─ 配置文件备份
└─ 当前镜像标记保存
3. 升级执行
├─ 拉取新版本镜像
├─ 执行数据库迁移(如有)
├─ 更新配置文件
├─ 滚动更新服务(零停机)
└─ 验证服务健康
4. 回滚准备
└─ 如升级失败,自动/手动回滚
升级方式选择:
-
方案A:滚动更新(推荐)
-
使用 Docker Compose 的滚动更新功能
-
确保至少有一个实例始终运行
-
适合生产环境
-
-
方案B:蓝绿部署
-
部署新版本到独立环境
-
切换流量后停止旧版本
-
适合大版本升级
-
-
方案C:基于版本标签切换
-
使用 Docker Compose 环境变量指定版本
-
通过更新
.env文件切换版本 -
简单易用,适合小团队
-
四、关键技术实现点
4.1 版本管理
-
版本注入:
-
构建时通过
--build-arg传入版本号 -
在代码中暴露
/api/version端点 -
镜像标签包含版本信息
-
-
版本查询:
# 在应用中暴露版本信息
4.2 健康检查
-
应用健康检查:
/health端点(已有) -
数据库连接检查
-
依赖服务检查(CubeJS、Redis)
-
Docker 健康检查:在 Compose 中配置
4.3 数据迁移处理
-
数据库迁移脚本:使用 Alembic 或自定义迁移脚本
-
迁移时机:升级前检查并执行必要的迁移
-
迁移回滚:保留回滚脚本
4.4 配置管理
-
环境变量模板:提供
.env.example -
配置验证:启动前验证必需配置
-
配置热更新:支持部分配置无需重启的更新
五、客户交付包设计
5.1 交付包内容
aixx-delivery-v1.0.0/
├── README.md # 部署说明
├── QUICKSTART.md # 快速启动指南
├── docker-compose.yml # 生产环境编排
├── .env.example # 环境变量模板
├── docker/ # 部署脚本目录
│ ├── init.sh # 初始化脚本
│ ├── upgrade.sh # 升级脚本
│ ├── backup.sh # 备份脚本
│ └── healthcheck.sh # 健康检查脚本
├── scripts/ # 工具脚本
│ ├── setup.sh # 一键部署脚本
│ └── migrate.sh # 数据迁移脚本
└── docs/ # 文档目录
├── DEPLOYMENT.md # 部署文档
├── UPGRADE.md # 升级文档
└── TROUBLESHOOTING.md # 故障排查文档
5.2 一键部署脚本功能
-
环境检查(Docker、Docker Compose 版本)
-
配置文件生成和验证
-
数据目录创建和权限设置
-
服务启动和验证
-
初始数据导入(可选)
六、升级脚本设计
6.1 升级脚本功能
./upgrade.sh [选项]
--version VERSION # 指定升级版本
--check # 仅检查可用版本
--rollback # 回滚到上一版本
--force # 强制升级(跳过检查)
--dry-run # 预览模式,不实际执行
6.2 升级脚本执行流程
-
前置检查:环境、版本、兼容性
-
备份:数据库、配置、当前镜像
-
下载:拉取新版本镜像
-
迁移:执行数据库迁移(如有)
-
更新:滚动更新容器
-
验证:健康检查和服务验证
-
清理:清理旧镜像(可选)
七、安全考虑
-
镜像安全:
-
使用官方基础镜像
-
定期更新依赖修复漏洞
-
镜像签名验证(可选)
-
-
数据安全:
-
敏感数据加密存储
-
备份加密
-
访问权限控制
-
-
网络安全:
-
最小端口暴露
-
使用内部网络通信
-
TLS/SSL 加密(生产环境)
-
八、监控与日志
-
日志管理:
-
统一日志格式
-
日志轮转策略
-
日志收集(可选集成 ELK)
-
-
监控指标:
-
容器资源使用
-
应用性能指标
-
健康检查状态
-
九、实施步骤建议
第一阶段:基础容器化
-
创建生产环境 Dockerfile
-
创建生产环境 docker-compose.yml
-
实现基本的启动和健康检查
第二阶段:版本管理
-
实现版本注入机制
-
添加版本查询 API
-
完善版本标签策略
第三阶段:升级机制
-
开发升级脚本
-
实现备份机制
-
测试升级流程
第四阶段:交付优化
-
编写部署文档
-
创建一键部署脚本
-
完善错误处理和日志
第五阶段:测试验证
-
在不同环境测试部署
-
测试升级和回滚流程
-
性能和安全测试
十、注意事项
-
向后兼容:确保升级时 API 和数据结构向后兼容
-
数据迁移:仔细设计数据库迁移策略,确保数据安全
-
零停机:使用滚动更新确保服务连续性
-
文档完善:提供清晰的部署和升级文档
-
测试充分:在生产环境前充分测试所有流程
该方案便于:
-
标准化交付
-
简单升级(一键或脚本化)
-
支持回滚
-
便于维护和管理