Docker Compose 部署指南
概述
本文档介绍如何使用 Docker Compose 部署麦瓣健康后端微服务。
架构说明
┌─────────────────────────────────────────────────────────────┐
│ Docker Network │
│ (172.20.0.0/16) │
│ │
│ ┌──────────────┐ ┌──────────────┐ ┌──────────────┐ │
│ │ Gateway │ │ Admin │ │ User │ │
│ │ 172.20.0.10 │ │ 172.20.0.11 │ │ 172.20.0.12 │ │
│ │ :8201 │ │ :8081 │ │ :8084 │ │
│ └──────────────┘ └──────────────┘ └──────────────┘ │
│ │
│ ┌──────────────┐ ┌──────────────┐ ┌──────────────┐ │
│ │ IM │ │ Nurse │ │ Monitor │ │
│ │ 172.20.0.13 │ │ 172.20.0.14 │ │ 172.20.0.16 │ │
│ │ :8085 │ │ :8082 │ │ :8086 │ │
│ └──────────────┘ └──────────────┘ └──────────────┘ │
│ │
│ ┌──────────────┐ ┌──────────────┐ ┌──────────────┐ │
│ │ Nacos │ │ RabbitMQ │ │ MongoDB │ │
│ │ 172.20.0.5 │ │ 172.20.0.6 │ │ 172.20.0.7 │ │
│ │ :8848 │ │ :5672/:15672 │ │ :27017 │ │
│ └──────────────┘ └──────────────┘ └──────────────┘ │
└─────────────────────────────────────────────────────────────┘
│
▼
┌───────────────────────────────┐
│ 远程基础服务 │
│ MySQL / Redis │
└───────────────────────────────┘
服务端口映射
| 服务 | 容器端口 | 宿主机端口 | 固定 IP |
|---|---|---|---|
| Gateway | 8201 | 8201 | 172.20.0.10 |
| Admin | 8081 | 8081 | 172.20.0.11 |
| User | 8081 | 8084 | 172.20.0.12 |
| IM | 8081 | 8085 | 172.20.0.13 |
| Nurse | 8082 | 8082 | 172.20.0.14 |
| Monitor | 8081 | 8086 | 172.20.0.16 |
| Nacos | 8848 | 8848 | 172.20.0.5 |
| RabbitMQ (AMQP) | 5672 | 5672 | 172.20.0.6 |
| RabbitMQ (管理) | 15672 | 15672 | 172.20.0.6 |
| MongoDB | 27017 | 27017 | 172.20.0.7 |
环境准备
1. 安装 Docker
# CentOS/RHEL
yum install -y docker-ce docker-ce-cli containerd.io docker-compose-plugin
# Ubuntu/Debian
apt-get install -y docker-ce docker-ce-cli containerd.io docker-compose-plugin
# 启动 Docker
systemctl start docker
systemctl enable docker
2. 登录阿里云容器镜像服务
docker login --username=<用户名> maiban-ack-registry.cn-beijing.cr.aliyuncs.com
3. 准备项目文件
# 克隆项目
git clone <仓库地址> /opt/maiban-center
cd /opt/maiban-center/backend
# 复制环境配置
cp .env.example .env
配置说明
环境变量配置 (.env)
# ==============================================
# Docker 镜像版本 (对应 git tag)
# ==============================================
IMAGE_VERSION=v0.1.0
# ==============================================
# 基础组件镜像版本 (以 base-* 标签触发生成)
# ==============================================
BASE_IMAGE_VERSION=base-2025.12.02-1207
# ==============================================
# MySQL 数据库配置 - 阿里云 RDS
# ==============================================
SPRING_DATASOURCE_URL=jdbc:mysql://your-rds-host:3306/maiban_health?useUnicode=true&characterEncoding=utf-8&serverTimezone=Asia/Shanghai&useSSL=false
SPRING_DATASOURCE_USERNAME=your_username
SPRING_DATASOURCE_PASSWORD=your_password
# ==============================================
# Redis 配置 - 阿里云 Redis
# ==============================================
SPRING_DATA_REDIS_HOST=your-redis-host
SPRING_DATA_REDIS_PORT=6379
SPRING_DATA_REDIS_PASSWORD=your_password
SPRING_DATA_REDIS_DATABASE=0
# 如果使用本项目 docker-compose 启动了 Redis,推荐:
# SPRING_DATA_REDIS_HOST=redis
# SPRING_DATA_REDIS_PORT=6379
# SPRING_DATA_REDIS_PASSWORD=your_password
# ==============================================
# Nacos 配置中心
# ==============================================
SPRING_CLOUD_NACOS_DISCOVERY_SERVER_ADDR=your-nacos-host:8848
SPRING_CLOUD_NACOS_CONFIG_SERVER_ADDR=your-nacos-host:8848
SPRING_CLOUD_NACOS_USERNAME=nacos
SPRING_CLOUD_NACOS_PASSWORD=nacos
# 如果使用本项目 docker-compose 启动了 Nacos,推荐:
# SPRING_CLOUD_NACOS_DISCOVERY_SERVER_ADDR=nacos:8848
# SPRING_CLOUD_NACOS_CONFIG_SERVER_ADDR=nacos:8848
# ==============================================
# MongoDB 配置
# ==============================================
SPRING_DATA_MONGODB_URI=mongodb://admin:password@your-mongo-host:27017/maiban_health
SPRING_DATA_MONGODB_DATABASE=maiban_health
# 如果使用本项目 docker-compose 启动了 MongoDB,推荐:
# SPRING_DATA_MONGODB_URI=mongodb://admin:admin123@mongodb:27017/maiban_health?authSource=admin
# ==============================================
# RabbitMQ 配置
# ==============================================
SPRING_RABBITMQ_HOST=your-rabbitmq-host
SPRING_RABBITMQ_PORT=5672
SPRING_RABBITMQ_USERNAME=admin
SPRING_RABBITMQ_PASSWORD=password
SPRING_RABBITMQ_VIRTUAL_HOST=/maiban
# 如果使用本项目 docker-compose 启动了 RabbitMQ,推荐:
# SPRING_RABBITMQ_HOST=rabbitmq
# SPRING_RABBITMQ_PORT=5672
# SPRING_RABBITMQ_USERNAME=admin
# SPRING_RABBITMQ_PASSWORD=admin123
# SPRING_RABBITMQ_VIRTUAL_HOST=/
# ==============================================
# 应用环境
# ==============================================
SPRING_PROFILES_ACTIVE=prod
镜像命名规则
镜像存储在阿里云 ACR,命名格式:
maiban-ack-registry.cn-beijing.cr.aliyuncs.com/maiban/center:{VERSION}-{SERVICE}
示例:
maiban-ack-registry.cn-beijing.cr.aliyuncs.com/maiban/center:v0.1.0-gatewaymaiban-ack-registry.cn-beijing.cr.aliyuncs.com/maiban/center:v0.1.0-admin
基础组件镜像示例:
maiban-ack-registry.cn-beijing.cr.aliyuncs.com/maiban/center:base-2025.12.02-1207-nacosmaiban-ack-registry.cn-beijing.cr.aliyuncs.com/maiban/center:base-2025.12.02-1207-mongodbmaiban-ack-registry.cn-beijing.cr.aliyuncs.com/maiban/center:base-2025.12.02-1207-rabbitmq
部署操作
方式一:使用部署脚本(推荐)
cd /opt/maiban-center/backend
# 部署指定版本
./deploy.sh v0.1.0
# 或使用 .env 中配置的版本
./deploy.sh
方式二:手动部署
cd /opt/maiban-center/backend
# 1. 设置版本
export VERSION=v0.1.0
sed -i "s/^IMAGE_VERSION=.*/IMAGE_VERSION=${VERSION}/" .env
# 2. 创建日志目录
mkdir -p logs/{gateway,admin,user,im,nurse,monitor}
# 3. 创建基础组件数据目录
mkdir -p /data/maiban/{rabbitmq,mongodb}
# 4. 拉取镜像
docker-compose pull
# 5. 启动所有服务
docker-compose up -d
# 6. 查看状态
docker-compose ps
方式三:自动化部署(CI/CD)
推送 Git Tag 自动触发部署:
# 创建并推送 tag
git tag v0.1.0
git push origin v0.1.0
GitHub Actions 会自动:
- 构建 Java 项目
- 构建 Docker 镜像
- 推送到阿里云 ACR
- SSH 到服务器执行部署
运维操作
查看服务状态
# 查看所有服务
docker-compose ps
# 查看服务日志
docker-compose logs -f maiban-gateway
# 查看挂载的日志文件
tail -f logs/gateway/*.log
重启服务
# 重启单个服务
docker-compose restart maiban-gateway
# 重启所有服务
docker-compose restart
更新服务
# 更新单个服务
docker-compose pull maiban-gateway
docker-compose up -d --no-deps maiban-gateway
# 滚动更新所有服务(不包含已移除的订单服务)
for svc in maiban-gateway maiban-admin maiban-user maiban-im maiban-nurse maiban-monitor; do
docker-compose up -d --no-deps $svc
sleep 10
done
停止服务
# 停止所有服务(保留容器)
docker-compose stop
# 停止并删除容器
docker-compose down
# 停止并删除容器、网络、卷
docker-compose down -v
清理资源
# 清理未使用的镜像
docker image prune -f
# 清理所有未使用资源
docker system prune -f
健康检查
手动检查
# 检查网关健康
curl http://localhost:8201/actuator/health
# 检查管理后台
curl http://localhost:8081/actuator/health
# 批量检查
for port in 8201 8081 8084 8082 8085 8086; do
echo "Port $port: $(curl -sf http://localhost:$port/actuator/health | jq -r '.status' 2>/dev/null || echo 'DOWN')"
done
自动健康检查
Docker Compose 已配置健康检查:
- 检查间隔:30秒
- 超时时间:3秒
- 启动等待:60秒
- 重试次数:3次
查看健康状态:
docker inspect --format='{{.State.Health.Status}}' maiban-gateway
日志管理
日志目录结构
backend/logs/
├── gateway/ # 网关服务日志
├── admin/ # 管理后台日志
├── user/ # 用户服务日志
├── im/ # IM 服务日志
├── nurse/ # 护士服务日志
└── monitor/ # 监控服务日志
日志配置
已配置日志轮转:
- 单文件最大:50MB
- 保留文件数:3个
- 驱动:json-file
查看日志
# 实时查看容器日志
docker-compose logs -f maiban-gateway
# 查看挂载的应用日志
tail -f logs/gateway/*.log
# 查看最近 100 行
docker-compose logs --tail=100 maiban-admin
故障排查
服务启动失败
# 1. 查看容器日志
docker-compose logs maiban-gateway
# 2. 检查容器状态
docker inspect maiban-gateway
# 3. 进入容器排查
docker exec -it maiban-gateway sh
# 4. 检查网络连通性
docker exec maiban-gateway ping -c 3 <nacos-host>
docker exec maiban-gateway nc -zv <mysql-host> 3306
网络问题
# 检查网络
docker network ls
docker network inspect backend_maiban-network
# 检查容器 IP
docker inspect -f '{{range.NetworkSettings.Networks}}{{.IPAddress}}{{end}}' maiban-gateway
资源问题
# 查看资源使用
docker stats
# 检查磁盘空间
df -h
docker system df
安全建议
敏感信息保护
.env文件不要提交到 Git- 生产环境使用 Secrets 管理
网络安全
- 仅暴露必要端口
- 使用防火墙限制访问
镜像安全
- 定期更新基础镜像
- 使用镜像扫描工具
访问控制
- 限制 Docker API 访问
- 使用最小权限原则
附录
GitHub Secrets 配置
| Secret 名称 | 说明 |
|---|---|
DEPLOY_HOST | 部署服务器 IP |
DEPLOY_USER | SSH 用户名 |
DEPLOY_SSH_KEY | SSH 私钥 |
DEPLOY_PORT | SSH 端口(默认 22) |
DEPLOY_PATH | 项目部署路径 |
ACR_REGISTRY_USERNAME | 阿里云 ACR 用户名 |
ACR_REGISTRY_PASSWORD | 阿里云 ACR 密码 |
常用命令速查
# 部署
./deploy.sh v0.1.0
# 查看状态
docker-compose ps
# 查看日志
docker-compose logs -f <service>
# 重启服务
docker-compose restart <service>
# 更新服务
docker-compose pull && docker-compose up -d
# 进入容器
docker exec -it <container> sh
# 清理资源
docker system prune -f
