# Docker部署
**本文档中引用的文件**
- [docker-compose.yml](file://docker-compose.yml)
- [docker-compose.override.yml](file://docker-compose.override.yml)
- [docker-compose.override.agile.yml](file://docker-compose.override.agile.yml)
- [docker-compose.override.configuration.yml](file://docker-compose.override.configuration.yml)
- [docker-compose.middleware.yml](file://docker-compose.middleware.yml)
- [deploy.ps1](file://deploy/deploy.ps1)
- [00.auto-config-docker.cmd](file://starter/00.auto-config-docker.cmd)
- [readme.md](file://starter/readme.md)
## 目录
1. [简介](#简介)
2. [项目架构概览](#项目架构概览)
3. [核心服务组件](#核心服务组件)
4. [Docker Compose配置详解](#docker-compose配置详解)
5. [环境配置管理](#环境配置管理)
6. [中间件服务部署](#中间件服务部署)
7. [部署流程与最佳实践](#部署流程与最佳实践)
8. [运维监控配置](#运维监控配置)
9. [故障排查指南](#故障排查指南)
10. [总结](#总结)
## 简介
本项目采用基于Docker Compose的容器化部署方案,实现了微服务架构的完整容器化部署。该部署方案支持多种环境配置,包括开发、测试和生产环境,并提供了灵活的配置管理和服务编排能力。
系统采用前后端分离架构,包含多个独立的微服务,通过API网关进行统一管理。所有服务都运行在Docker容器中,确保了环境的一致性和可移植性。
## 项目架构概览
```mermaid
graph TB
subgraph "前端层"
UI[Vue.js 前端应用]
end
subgraph "API网关层"
Gateway[内部API网关]
end
subgraph "业务服务层"
Auth[认证服务
sts-server/sts-api]
Admin[管理服务
admin-api]
Platform[平台服务
platform-api]
Localization[国际化服务
localization-api]
Messages[消息服务
messages-api]
Task[任务管理
task-api]
Webhook[Webhook服务
webhook-api]
Workflow[工作流服务
workflow-api]
Wechat[微信服务
wechat-api]
end
subgraph "中间件层"
MySQL[(MySQL数据库)]
Redis[(Redis缓存)]
RabbitMQ[(RabbitMQ消息队列)]
Elastic[(Elasticsearch)]
Kibana[Kibana监控]
end
UI --> Gateway
Gateway --> Auth
Gateway --> Admin
Gateway --> Platform
Gateway --> Localization
Gateway --> Messages
Gateway --> Task
Gateway --> Webhook
Gateway --> Workflow
Gateway --> Wechat
Auth --> MySQL
Admin --> MySQL
Platform --> MySQL
Localization --> MySQL
Messages --> MySQL
Task --> MySQL
Webhook --> MySQL
Workflow --> MySQL
Wechat --> MySQL
Auth --> Redis
Admin --> Redis
Platform --> Redis
Localization --> Redis
Messages --> Redis
Task --> Redis
Webhook --> Redis
Workflow --> Redis
Wechat --> Redis
Auth --> RabbitMQ
Admin --> RabbitMQ
Platform --> RabbitMQ
Localization --> RabbitMQ
Messages --> RabbitMQ
Task --> RabbitMQ
Webhook --> RabbitMQ
Workflow --> RabbitMQ
Wechat --> RabbitMQ
Auth --> Elastic
Admin --> Elastic
Platform --> Elastic
Localization --> Elastic
Messages --> Elastic
Task --> Elastic
Webhook --> Elastic
Workflow --> Elastic
Wechat --> Elastic
Gateway --> Elastic
Gateway --> Kibana
```
**图表来源**
- [docker-compose.yml](file://docker-compose.yml#L1-L244)
- [docker-compose.middleware.yml](file://docker-compose.middleware.yml#L1-L115)
## 核心服务组件
### 服务编排结构
系统包含以下核心服务组件:
1. **认证服务系列**
- `sts-server`: IdentityServer认证服务器
- `sts-api`: 认证管理API服务
2. **业务服务系列**
- `admin-api`: 后台管理系统API
- `platform-api`: 平台管理服务
- `localization-api`: 国际化服务
- `messages-api`: 消息通知服务
- `task-api`: 任务管理服务
- `webhook-api`: Webhook管理服务
- `workflow-api`: 工作流引擎服务
- `wechat-api`: 微信集成服务
3. **网关服务**
- `internal-apigateway`: 内部API网关
4. **前端服务**
- `ui`: Vue.js前端应用
### 服务依赖关系
```mermaid
graph LR
subgraph "认证层"
STS[sts-server]
STS_API[sts-api]
end
subgraph "业务层"
ADMIN[admin-api]
PLATFORM[platform-api]
LOCALIZATION[localization-api]
MESSAGES[messages-api]
TASK[task-api]
WEBHOOK[webhook-api]
WORKFLOW[workflow-api]
WECHAT[wechat-api]
end
subgraph "网关层"
GATEWAY[internal-apigateway]
end
subgraph "前端层"
FRONTEND[ui]
end
STS --> STS_API
STS_API --> ADMIN
STS_API --> PLATFORM
STS_API --> LOCALIZATION
STS_API --> MESSAGES
STS_API --> TASK
STS_API --> WEBHOOK
STS_API --> WORKFLOW
STS_API --> WECHAT
ADMIN --> GATEWAY
PLATFORM --> GATEWAY
LOCALIZATION --> GATEWAY
MESSAGES --> GATEWAY
TASK --> GATEWAY
WEBHOOK --> GATEWAY
WORKFLOW --> GATEWAY
WECHAT --> GATEWAY
GATEWAY --> FRONTEND
```
**图表来源**
- [docker-compose.yml](file://docker-compose.yml#L1-L244)
- [docker-compose.override.yml](file://docker-compose.override.yml#L1-L135)
**章节来源**
- [docker-compose.yml](file://docker-compose.yml#L1-L244)
- [docker-compose.override.yml](file://docker-compose.override.yml#L1-L135)
## Docker Compose配置详解
### 主配置文件 (docker-compose.yml)
主配置文件定义了所有服务的基本结构和网络配置:
```yaml
version: '3.4'
services:
admin-api:
hostname: admin-api
container_name: admin-api
environment:
- ASPNETCORE_ENVIRONMENT=Development
- ASPNETCORE_HTTP_PORTS=80
- TZ=Asia/Shanghai
ports:
- "30010:80"
networks:
- abp-next-admin
healthcheck:
test: ["CMD-SHELL", "wget --spider http://localhost/healthz || exit"]
interval: 10s
timeout: 5s
retries: 5
extra_hosts:
- "host.docker.internal:host-gateway"
- "auth-server:host-gateway"
```
### 关键配置特性
1. **健康检查配置**
- 所有服务都配置了健康检查机制
- 使用wget命令检查 `/healthz` 端点
- 配置重试策略确保服务稳定性
2. **网络配置**
- 使用自定义桥接网络 `abp-next-admin`
- 支持服务间通信和外部访问
3. **主机映射**
- 使用 `extra_hosts` 配置主机别名
- 支持 `host.docker.internal` 访问宿主机
### 服务构建配置
每个服务都配置了独立的构建上下文:
```yaml
services:
admin-api:
build:
context: ./aspnet-core/services/Publish/admin
volumes:
- ./deploy/framework/admin/logs:/app/Logs
- ./deploy/framework/admin/modules:/app/Modules
restart: always
depends_on:
- sts-server
```
**章节来源**
- [docker-compose.yml](file://docker-compose.yml#L1-L244)
- [docker-compose.override.yml](file://docker-compose.override.yml#L1-L135)
## 环境配置管理
### 多环境配置策略
系统采用分层配置管理策略,支持多种环境配置:
```mermaid
flowchart TD
Base[基础配置 docker-compose.yml] --> Override[覆盖配置 docker-compose.override.yml]
Override --> Agile[敏捷配置 docker-compose.override.agile.yml]
Override --> Config[配置中心 docker-compose.override.configuration.yml]
Agile --> Dev[开发环境]
Config --> Prod[生产环境]
Dev --> Services[服务实例]
Prod --> Services
Services --> Health[健康检查]
Services --> Logs[日志收集]
Services --> Monitor[监控指标]
```
**图表来源**
- [docker-compose.override.agile.yml](file://docker-compose.override.agile.yml#L1-L147)
- [docker-compose.override.configuration.yml](file://docker-compose.override.configuration.yml#L1-L614)
### 配置文件优先级
1. **基础配置** (`docker-compose.yml`)
- 定义基本服务结构和网络
- 包含所有服务的基础配置
2. **覆盖配置** (`docker-compose.override.yml`)
- 提供本地开发环境的构建配置
- 包含卷挂载和重启策略
3. **环境特定配置**
- `docker-compose.override.agile.yml`: 敏捷配置中心
- `docker-compose.override.configuration.yml`: 配置中心
### 环境变量管理
每个服务都配置了大量的环境变量,涵盖以下方面:
1. **数据库连接**
```yaml
- ConnectionStrings__Default=Server=host.docker.internal;Database=Platform-V70;User Id=root;Password=123456
```
2. **缓存配置**
```yaml
- Redis__Configuration=host.docker.internal,defaultDatabase=10
- Redis__InstanceName=LINGYUN.Abp.Application
```
3. **消息队列**
```yaml
- CAP__RabbitMQ__HostName=host.docker.internal
- CAP__RabbitMQ__Port=5672
- CAP__RabbitMQ__UserName=admin
- CAP__RabbitMQ__Password=123456
```
4. **分布式锁**
```yaml
- DistributedLock__IsEnabled=true
- DistributedLock__Redis__Configuration=host.docker.internal,defaultDatabase=13
```
**章节来源**
- [docker-compose.override.agile.yml](file://docker-compose.override.agile.yml#L1-L147)
- [docker-compose.override.configuration.yml](file://docker-compose.override.configuration.yml#L1-L614)
## 中间件服务部署
### 中间件服务架构
```mermaid
graph TB
subgraph "数据库层"
MySQL[MySQL 3306
数据库存储]
end
subgraph "缓存层"
Redis[Redis 6379
缓存存储]
end
subgraph "消息队列层"
RabbitMQ[RabbitMQ 5672
消息队列]
RabbitWeb[RabbitMQ Management
5672/15672]
end
subgraph "搜索层"
Elastic[Elasticsearch 9200
全文搜索]
Kibana[Kibana 5601
可视化界面]
Logstash[Logstash 4560
日志处理]
end
subgraph "网络层"
Network[abp-next-admin
自定义网络]
end
Network --> MySQL
Network --> Redis
Network --> RabbitMQ
Network --> RabbitWeb
Network --> Elastic
Network --> Kibana
Network --> Logstash
```
**图表来源**
- [docker-compose.middleware.yml](file://docker-compose.middleware.yml#L1-L115)
### 数据库服务配置
MySQL服务配置了完整的持久化和初始化脚本:
```yaml
abp-mysql:
image: mysql
hostname: abp-mysql
container_name: abp-mysql
ports:
- "3306:3306"
environment:
- MYSQL_ROOT_PASSWORD=123456
- MYSQL_ROOT_HOST=%
- TZ=Asia/Shanghai
command:
--default-authentication-plugin=mysql_native_password
--character-set-server=utf8mb4
--collation-server=utf8mb4_general_ci
--lower_case_table_names=1
--max_connections=1024
volumes:
- ./deploy/middleware/mysql/data:/var/lib/mysql
- ./deploy/middleware/mysql/conf:/etc/mysql/conf.d
- ./deploy/middleware/mysql/logs:/logs
- ./deploy/mysql/docker-entrypoint-initdb.d:/docker-entrypoint-initdb.d
```
### 缓存服务配置
Redis服务配置了高可用和持久化:
```yaml
abp-redis:
image: redis:6
hostname: abp-redis
container_name: abp-redis
environment:
- TZ=Asia/Shanghai
volumes:
- ./deploy/middleware/redis/data:/data
ports:
- "6379:6379"
restart: always
```
### 消息队列服务配置
RabbitMQ服务配置了管理界面和持久化:
```yaml
abp-rabbitmq:
image: rabbitmq:management
hostname: abp-rabbitmq
container_name: abp-rabbitmq
ports:
- "5672:5672"
- "15672:15672"
- "25672:25672"
environment:
- RABBITMQ_ERLANG_COOKIE=8ue48g9FJQ87YV9Hfd8yhg==
- RABBITMQ_DEFAULT_VHOST=/
- RABBITMQ_DEFAULT_USER=admin
- RABBITMQ_DEFAULT_PASS=123456
- TZ=Asia/Shanghai
volumes:
- ./deploy/middleware/rabbitmq/logs:/var/log/rabbitmq
- ./deploy/middleware/rabbitmq/data:/var/lib/rabbitmq
```
### 搜索服务配置
Elasticsearch和Kibana配置了完整的日志和搜索功能:
```yaml
abp-elasticsearch:
image: elasticsearch:7.16.3
container_name: abp-elasticsearch
restart: always
environment:
- "cluster.name=elasticsearch"
- "discovery.type=single-node"
- "ES_JAVA_OPTS=-Xms15g -Xmx15g"
- TZ=Asia/Shanghai
volumes:
- ./deploy/middleware/elasticsearch/plugins:/usr/share/elasticsearch/plugins
- ./deploy/middleware/elasticsearch/data:/usr/share/elasticsearch/data
ports:
- 9200:9200
abp-kibana:
image: kibana:7.16.3
container_name: abp-kibana
restart: always
depends_on:
- abp-elasticsearch
environment:
- ELASTICSEARCH_URL=http://host.docker.internal:9200
- TZ=Asia/Shanghai
ports:
- 5601:5601
```
**章节来源**
- [docker-compose.middleware.yml](file://docker-compose.middleware.yml#L1-L115)
## 部署流程与最佳实践
### 自动化部署脚本
系统提供了完整的自动化部署脚本:
```powershell
# 1. 部署中间件
Write-host "deploy middleware..."
Set-Location $rootFolder
docker-compose -f .\docker-compose.middleware.yml up -d --build
# 2. 等待数据库初始化
Write-host "initial database..."
Start-Sleep -Seconds 30
# 3. 创建数据库
Write-host "create database..."
Set-Location $aspnetcorePath
cmd.exe /c create-database.bat
# 4. 执行数据库迁移
Write-host "migrate database..."
Set-Location $buildPath
foreach ($solution in $migrationArray) {
Set-Location $solution.Path
dotnet run --no-build
}
# 5. 发布程序包
Write-host "release .net project..."
Set-Location $buildPath
foreach ($solution in $serviceArray) {
$publishPath = $rootFolder + "/aspnet-core/services/Publish/" + $solution.Service + "/"
dotnet publish -c Release -o $publishPath $solution.Path --no-cache
$dockerFile = Join-Path $solution.Path "Dockerfile"
if ((Test-Path $dockerFile)) {
Copy-Item $dockerFile -Destination $publishPath
}
}
# 6. 构建前端项目
Write-host "build front project..."
Set-Location $vuePath
pnpm install
pnpm build
# 7. 运行应用程序
Write-host "running application..."
Set-Location $rootFolder
docker-compose -f .\docker-compose.yml -f .\docker-compose.override.yml -f .\docker-compose.override.configuration.yml up -d --build
```
### 快速启动脚本
系统提供了快速启动脚本,简化部署流程:
```mermaid
flowchart TD
AutoConfig[00.auto-config-docker.cmd
自动配置Docker环境] --> MigrateDB[01.migrate-db.cmd
数据库迁移]
MigrateDB --> StartHost[80.start-host.cmd
启动后端服务]
StartHost --> InstallNode[91.install-node-module.cmd
安装前端依赖]
InstallNode --> StartUI[99.start-ui.cmd
启动前端应用]
subgraph "启动顺序"
Step1[步骤1: 中间件部署]
Step2[步骤2: 数据库准备]
Step3[步骤3: 服务发布]
Step4[步骤4: 应用启动]
end
AutoConfig --> Step1
MigrateDB --> Step2
StartHost --> Step3
StartUI --> Step4
```
**图表来源**
- [deploy.ps1](file://deploy/deploy.ps1#L1-L60)
- [readme.md](file://starter/readme.md#L1-L11)
### 部署最佳实践
1. **环境隔离**
- 使用独立的Docker网络隔离服务
- 配置适当的防火墙规则
- 使用不同的端口避免冲突
2. **资源规划**
- 为Elasticsearch分配充足的内存
- 配置合理的CPU和内存限制
- 使用持久化存储确保数据安全
3. **监控和日志**
- 启用健康检查机制
- 配置集中式日志收集
- 设置告警机制
4. **备份策略**
- 定期备份数据库
- 保存配置文件
- 备份容器镜像
**章节来源**
- [deploy.ps1](file://deploy/deploy.ps1#L1-L60)
- [00.auto-config-docker.cmd](file://starter/00.auto-config-docker.cmd#L1-L27)
## 运维监控配置
### 健康检查配置
所有服务都配置了健康检查机制:
```yaml
healthcheck:
test: ["CMD-SHELL", "wget --spider http://localhost/healthz || exit"]
interval: 10s
timeout: 5s
retries: 5
```
### 日志收集配置
每个服务都配置了日志卷挂载:
```yaml
volumes:
- ./deploy/framework/admin/logs:/app/Logs
- ./deploy/framework/admin/modules:/app/Modules
```
### 监控指标暴露
系统集成了多种监控工具:
1. **Elasticsearch监控**
- 指标收集和存储
- 性能监控
- 错误追踪
2. **Kibana可视化**
- 数据可视化
- 报表生成
- 实时监控
3. **RabbitMQ管理界面**
- 消息队列监控
- 队列状态查看
- 性能指标
### 分布式追踪
系统支持分布式追踪和链路追踪:
```yaml
CAP__EventBus__DefaultGroup=BackendAdmin
CAP__EventBus__Version=v1
CAP__EventBus__FailedRetryInterval=300
CAP__EventBus__FailedRetryCount=10
```
**章节来源**
- [docker-compose.yml](file://docker-compose.yml#L1-L244)
- [docker-compose.override.configuration.yml](file://docker-compose.override.configuration.yml#L1-L614)
## 故障排查指南
### 常见问题及解决方案
#### 1. 容器启动失败
**症状**: 容器无法正常启动或频繁重启
**排查步骤**:
```bash
# 查看容器日志
docker logs container_name
# 检查容器状态
docker ps -a
# 检查网络连接
docker network inspect abp-next-admin
```
**解决方案**:
- 检查环境变量配置
- 验证端口是否被占用
- 确认依赖服务是否正常运行
#### 2. 网络连接问题
**症状**: 服务间无法通信
**排查步骤**:
```bash
# 测试网络连通性
docker exec container_name ping host.docker.internal
# 检查DNS解析
docker exec container_name nslookup auth-server
```
**解决方案**:
- 配置正确的 `extra_hosts`
- 检查网络驱动类型
- 验证防火墙设置
#### 3. 数据卷权限错误
**症状**: 容器无法写入数据卷
**排查步骤**:
```bash
# 检查卷权限
ls -la ./deploy/
# 检查容器用户
docker exec container_name whoami
```
**解决方案**:
- 修改卷权限
- 使用正确的用户ID
- 配置SELinux标签
#### 4. 数据库连接失败
**症状**: 服务无法连接到数据库
**排查步骤**:
```bash
# 检查数据库容器状态
docker logs abp-mysql
# 测试数据库连接
docker exec -it abp-mysql mysql -u root -p
```
**解决方案**:
- 验证数据库密码
- 检查网络配置
- 确认数据库服务状态
### 调试工具和技巧
1. **容器调试**
```bash
# 进入容器交互模式
docker exec -it container_name bash
# 查看进程状态
docker exec container_name ps aux
```
2. **网络调试**
```bash
# 网络连通性测试
docker exec container_name telnet target_host port
# 网络配置检查
docker exec container_name ip addr show
```
3. **性能监控**
```bash
# 容器资源使用情况
docker stats
# 系统资源使用情况
docker system df
```
### 日志分析
系统提供了完整的日志收集和分析能力:
1. **服务日志**
- 存储在 `./deploy/framework/*/logs/` 目录
- 支持轮转和清理
- 可配置日志级别
2. **中间件日志**
- 数据库操作日志
- 缓存访问日志
- 消息队列日志
3. **应用日志**
- 结构化日志格式
- 集中式日志收集
- 日志搜索和过滤
## 总结
本Docker部署方案提供了完整的微服务容器化解决方案,具有以下特点:
### 核心优势
1. **模块化设计**
- 清晰的服务边界
- 独立的配置管理
- 灵活的扩展能力
2. **环境一致性**
- 开发、测试、生产环境统一
- 自动化部署流程
- 版本控制和回滚
3. **运维友好**
- 完整的监控体系
- 详细的日志记录
- 简单的故障排查
4. **高性能**
- 优化的资源配置
- 高可用架构设计
- 缓存和负载均衡
### 最佳实践建议
1. **生产环境部署**
- 使用专用的生产配置文件
- 配置SSL证书和HTTPS
- 设置适当的资源限制
2. **监控和告警**
- 配置完整的监控指标
- 设置告警规则
- 定期检查系统健康状态
3. **安全加固**
- 使用强密码和密钥
- 配置网络安全策略
- 定期更新容器镜像
4. **备份和恢复**
- 定期备份重要数据
- 测试恢复流程
- 制定灾难恢复计划
通过遵循这些最佳实践和配置指南,可以确保系统的稳定运行和高效维护。Docker容器化部署不仅提高了开发效率,还为系统的可扩展性和可维护性奠定了坚实的基础。