19 KiB
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)目录
简介
本项目采用基于Docker Compose的容器化部署方案,实现了微服务架构的完整容器化部署。该部署方案支持多种环境配置,包括开发、测试和生产环境,并提供了灵活的配置管理和服务编排能力。
系统采用前后端分离架构,包含多个独立的微服务,通过API网关进行统一管理。所有服务都运行在Docker容器中,确保了环境的一致性和可移植性。
项目架构概览
graph TB
subgraph "前端层"
UI[Vue.js 前端应用]
end
subgraph "API网关层"
Gateway[内部API网关]
end
subgraph "业务服务层"
Auth[认证服务<br/>sts-server/sts-api]
Admin[管理服务<br/>admin-api]
Platform[平台服务<br/>platform-api]
Localization[国际化服务<br/>localization-api]
Messages[消息服务<br/>messages-api]
Task[任务管理<br/>task-api]
Webhook[Webhook服务<br/>webhook-api]
Workflow[工作流服务<br/>workflow-api]
Wechat[微信服务<br/>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
- docker-compose.middleware.yml
核心服务组件
服务编排结构
系统包含以下核心服务组件:
-
认证服务系列
sts-server: IdentityServer认证服务器sts-api: 认证管理API服务
-
业务服务系列
admin-api: 后台管理系统APIplatform-api: 平台管理服务localization-api: 国际化服务messages-api: 消息通知服务task-api: 任务管理服务webhook-api: Webhook管理服务workflow-api: 工作流引擎服务wechat-api: 微信集成服务
-
网关服务
internal-apigateway: 内部API网关
-
前端服务
ui: Vue.js前端应用
服务依赖关系
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
- docker-compose.override.yml
章节来源
- docker-compose.yml
- docker-compose.override.yml
Docker Compose配置详解
主配置文件 (docker-compose.yml)
主配置文件定义了所有服务的基本结构和网络配置:
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"
关键配置特性
-
健康检查配置
- 所有服务都配置了健康检查机制
- 使用wget命令检查
/healthz端点 - 配置重试策略确保服务稳定性
-
网络配置
- 使用自定义桥接网络
abp-next-admin - 支持服务间通信和外部访问
- 使用自定义桥接网络
-
主机映射
- 使用
extra_hosts配置主机别名 - 支持
host.docker.internal访问宿主机
- 使用
服务构建配置
每个服务都配置了独立的构建上下文:
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
- docker-compose.override.yml
环境配置管理
多环境配置策略
系统采用分层配置管理策略,支持多种环境配置:
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
- docker-compose.override.configuration.yml
配置文件优先级
-
基础配置 (
docker-compose.yml)- 定义基本服务结构和网络
- 包含所有服务的基础配置
-
覆盖配置 (
docker-compose.override.yml)- 提供本地开发环境的构建配置
- 包含卷挂载和重启策略
-
环境特定配置
docker-compose.override.agile.yml: 敏捷配置中心docker-compose.override.configuration.yml: 配置中心
环境变量管理
每个服务都配置了大量的环境变量,涵盖以下方面:
-
数据库连接
- ConnectionStrings__Default=Server=host.docker.internal;Database=Platform-V70;User Id=root;Password=123456 -
缓存配置
- Redis__Configuration=host.docker.internal,defaultDatabase=10 - Redis__InstanceName=LINGYUN.Abp.Application -
消息队列
- CAP__RabbitMQ__HostName=host.docker.internal - CAP__RabbitMQ__Port=5672 - CAP__RabbitMQ__UserName=admin - CAP__RabbitMQ__Password=123456 -
分布式锁
- DistributedLock__IsEnabled=true - DistributedLock__Redis__Configuration=host.docker.internal,defaultDatabase=13
章节来源
- docker-compose.override.agile.yml
- docker-compose.override.configuration.yml
中间件服务部署
中间件服务架构
graph TB
subgraph "数据库层"
MySQL[MySQL 3306<br/>数据库存储]
end
subgraph "缓存层"
Redis[Redis 6379<br/>缓存存储]
end
subgraph "消息队列层"
RabbitMQ[RabbitMQ 5672<br/>消息队列]
RabbitWeb[RabbitMQ Management<br/>5672/15672]
end
subgraph "搜索层"
Elastic[Elasticsearch 9200<br/>全文搜索]
Kibana[Kibana 5601<br/>可视化界面]
Logstash[Logstash 4560<br/>日志处理]
end
subgraph "网络层"
Network[abp-next-admin<br/>自定义网络]
end
Network --> MySQL
Network --> Redis
Network --> RabbitMQ
Network --> RabbitWeb
Network --> Elastic
Network --> Kibana
Network --> Logstash
图表来源
- docker-compose.middleware.yml
数据库服务配置
MySQL服务配置了完整的持久化和初始化脚本:
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服务配置了高可用和持久化:
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服务配置了管理界面和持久化:
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配置了完整的日志和搜索功能:
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
部署流程与最佳实践
自动化部署脚本
系统提供了完整的自动化部署脚本:
# 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
快速启动脚本
系统提供了快速启动脚本,简化部署流程:
flowchart TD
AutoConfig[00.auto-config-docker.cmd<br/>自动配置Docker环境] --> MigrateDB[01.migrate-db.cmd<br/>数据库迁移]
MigrateDB --> StartHost[80.start-host.cmd<br/>启动后端服务]
StartHost --> InstallNode[91.install-node-module.cmd<br/>安装前端依赖]
InstallNode --> StartUI[99.start-ui.cmd<br/>启动前端应用]
subgraph "启动顺序"
Step1[步骤1: 中间件部署]
Step2[步骤2: 数据库准备]
Step3[步骤3: 服务发布]
Step4[步骤4: 应用启动]
end
AutoConfig --> Step1
MigrateDB --> Step2
StartHost --> Step3
StartUI --> Step4
图表来源
- deploy.ps1
- readme.md
部署最佳实践
-
环境隔离
- 使用独立的Docker网络隔离服务
- 配置适当的防火墙规则
- 使用不同的端口避免冲突
-
资源规划
- 为Elasticsearch分配充足的内存
- 配置合理的CPU和内存限制
- 使用持久化存储确保数据安全
-
监控和日志
- 启用健康检查机制
- 配置集中式日志收集
- 设置告警机制
-
备份策略
- 定期备份数据库
- 保存配置文件
- 备份容器镜像
章节来源
- deploy.ps1
- 00.auto-config-docker.cmd
运维监控配置
健康检查配置
所有服务都配置了健康检查机制:
healthcheck:
test: ["CMD-SHELL", "wget --spider http://localhost/healthz || exit"]
interval: 10s
timeout: 5s
retries: 5
日志收集配置
每个服务都配置了日志卷挂载:
volumes:
- ./deploy/framework/admin/logs:/app/Logs
- ./deploy/framework/admin/modules:/app/Modules
监控指标暴露
系统集成了多种监控工具:
-
Elasticsearch监控
- 指标收集和存储
- 性能监控
- 错误追踪
-
Kibana可视化
- 数据可视化
- 报表生成
- 实时监控
-
RabbitMQ管理界面
- 消息队列监控
- 队列状态查看
- 性能指标
分布式追踪
系统支持分布式追踪和链路追踪:
CAP__EventBus__DefaultGroup=BackendAdmin
CAP__EventBus__Version=v1
CAP__EventBus__FailedRetryInterval=300
CAP__EventBus__FailedRetryCount=10
章节来源
- docker-compose.yml
- docker-compose.override.configuration.yml
故障排查指南
常见问题及解决方案
1. 容器启动失败
症状: 容器无法正常启动或频繁重启
排查步骤:
# 查看容器日志
docker logs container_name
# 检查容器状态
docker ps -a
# 检查网络连接
docker network inspect abp-next-admin
解决方案:
- 检查环境变量配置
- 验证端口是否被占用
- 确认依赖服务是否正常运行
2. 网络连接问题
症状: 服务间无法通信
排查步骤:
# 测试网络连通性
docker exec container_name ping host.docker.internal
# 检查DNS解析
docker exec container_name nslookup auth-server
解决方案:
- 配置正确的
extra_hosts - 检查网络驱动类型
- 验证防火墙设置
3. 数据卷权限错误
症状: 容器无法写入数据卷
排查步骤:
# 检查卷权限
ls -la ./deploy/
# 检查容器用户
docker exec container_name whoami
解决方案:
- 修改卷权限
- 使用正确的用户ID
- 配置SELinux标签
4. 数据库连接失败
症状: 服务无法连接到数据库
排查步骤:
# 检查数据库容器状态
docker logs abp-mysql
# 测试数据库连接
docker exec -it abp-mysql mysql -u root -p
解决方案:
- 验证数据库密码
- 检查网络配置
- 确认数据库服务状态
调试工具和技巧
-
容器调试
# 进入容器交互模式 docker exec -it container_name bash # 查看进程状态 docker exec container_name ps aux -
网络调试
# 网络连通性测试 docker exec container_name telnet target_host port # 网络配置检查 docker exec container_name ip addr show -
性能监控
# 容器资源使用情况 docker stats # 系统资源使用情况 docker system df
日志分析
系统提供了完整的日志收集和分析能力:
-
服务日志
- 存储在
./deploy/framework/*/logs/目录 - 支持轮转和清理
- 可配置日志级别
- 存储在
-
中间件日志
- 数据库操作日志
- 缓存访问日志
- 消息队列日志
-
应用日志
- 结构化日志格式
- 集中式日志收集
- 日志搜索和过滤
总结
本Docker部署方案提供了完整的微服务容器化解决方案,具有以下特点:
核心优势
-
模块化设计
- 清晰的服务边界
- 独立的配置管理
- 灵活的扩展能力
-
环境一致性
- 开发、测试、生产环境统一
- 自动化部署流程
- 版本控制和回滚
-
运维友好
- 完整的监控体系
- 详细的日志记录
- 简单的故障排查
-
高性能
- 优化的资源配置
- 高可用架构设计
- 缓存和负载均衡
最佳实践建议
-
生产环境部署
- 使用专用的生产配置文件
- 配置SSL证书和HTTPS
- 设置适当的资源限制
-
监控和告警
- 配置完整的监控指标
- 设置告警规则
- 定期检查系统健康状态
-
安全加固
- 使用强密码和密钥
- 配置网络安全策略
- 定期更新容器镜像
-
备份和恢复
- 定期备份重要数据
- 测试恢复流程
- 制定灾难恢复计划
通过遵循这些最佳实践和配置指南,可以确保系统的稳定运行和高效维护。Docker容器化部署不仅提高了开发效率,还为系统的可扩展性和可维护性奠定了坚实的基础。