CleanArchitecture容器化:Docker部署完整指南
概述
CleanArchitecture是一个基于.NET 9.0的现代化应用程序模板,遵循干净架构原则。本文将详细介绍如何将CleanArchitecture项目容器化,使用Docker进行部署,实现开发、测试和生产环境的一致性。
项目架构分析
CleanArchitecture采用分层架构设计,主要包含以下核心组件:
Docker环境准备
1. 安装Docker Desktop
确保系统已安装Docker Desktop,支持Windows、macOS和Linux平台。
2. 验证Docker安装
docker --version
docker-compose --version
创建Docker配置文件
1. 创建Dockerfile
在项目根目录创建Dockerfile:
# 使用.NET 9.0 SDK作为构建环境
FROM mcr.azk8s.cn/dotnet/sdk:9.0 AS build
WORKDIR /src
# 复制项目文件
COPY ["src/Clean.Architecture.Web/Clean.Architecture.Web.csproj", "src/Clean.Architecture.Web/"]
COPY ["src/Clean.Architecture.UseCases/Clean.Architecture.UseCases.csproj", "src/Clean.Architecture.UseCases/"]
COPY ["src/Clean.Architecture.Infrastructure/Clean.Architecture.Infrastructure.csproj", "src/Clean.Architecture.Infrastructure/"]
COPY ["src/Clean.Architecture.Core/Clean.Architecture.Core.csproj", "src/Clean.Architecture.Core/"]
COPY ["src/Clean.Architecture.ServiceDefaults/Clean.Architecture.ServiceDefaults.csproj", "src/Clean.Architecture.ServiceDefaults/"]
# 恢复NuGet包
RUN dotnet restore "src/Clean.Architecture.Web/Clean.Architecture.Web.csproj"
# 复制所有源代码
COPY . .
# 构建应用程序
WORKDIR "/src/src/Clean.Architecture.Web"
RUN dotnet build "Clean.Architecture.Web.csproj" -c Release -o /app/build
# 发布应用程序
RUN dotnet publish "Clean.Architecture.Web.csproj" -c Release -o /app/publish
# 使用.NET 9.0运行时作为最终镜像
FROM mcr.azk8s.cn/dotnet/aspnet:9.0 AS final
WORKDIR /app
COPY --from=build /app/publish .
# 暴露端口
EXPOSE 8080
EXPOSE 8081
# 设置环境变量
ENV ASPNETCORE_URLS=http://+:8080
ENV ASPNETCORE_ENVIRONMENT=Production
# 设置入口点
ENTRYPOINT ["dotnet", "Clean.Architecture.Web.dll"]
2. 创建docker-compose.yml
创建docker-compose.yml文件支持多容器部署:
version: '3.8'
services:
web:
build:
context: .
dockerfile: Dockerfile
ports:
- "8080:8080"
- "8081:8081"
environment:
- ASPNETCORE_ENVIRONMENT=Development
- ConnectionStrings__DefaultConnection=Server=db;Database=CleanArchitecture;User=sa;Password=Your_password123;TrustServerCertificate=true;
depends_on:
- db
networks:
- clean-architecture-network
db:
image: mcr.azk8s.cn/mssql/server:2022-latest
environment:
- ACCEPT_EULA=Y
- SA_PASSWORD=Your_password123
- MSSQL_PID=Express
ports:
- "1433:1433"
volumes:
- sql_data:/var/opt/mssql
networks:
- clean-architecture-network
volumes:
sql_data:
networks:
clean-architecture-network:
driver: bridge
3. 创建docker-compose.override.yml
创建开发环境覆盖配置:
version: '3.8'
services:
web:
environment:
- ASPNETCORE_ENVIRONMENT=Development
- ASPNETCORE_URLS=http://+:8080
volumes:
- .:/src
- ~/.nuget/packages:/root/.nuget/packages:ro
ports:
- "5000:8080"
- "5001:8081"
db:
environment:
- SA_PASSWORD=Your_password123
构建和运行容器
1. 构建Docker镜像
# 构建Web应用镜像
docker build -t clean-architecture-web .
# 查看构建的镜像
docker images
2. 使用Docker Compose启动服务
# 启动所有服务
docker-compose up -d
# 查看运行状态
docker-compose ps
# 查看日志
docker-compose logs web
3. 停止和清理服务
# 停止服务
docker-compose down
# 停止并删除卷
docker-compose down -v
# 清理未使用的资源
docker system prune
数据库迁移和初始化
1. 创建数据库迁移脚本
# 进入Web容器执行迁移
docker-compose exec web dotnet ef migrations add InitialCreate
# 应用迁移
docker-compose exec web dotnet ef database update
2. 使用Docker Compose运行迁移
在docker-compose.yml中添加迁移服务:
migrations:
build:
context: .
dockerfile: Dockerfile
command: dotnet ef database update
depends_on:
- db
environment:
- ConnectionStrings__DefaultConnection=Server=db;Database=CleanArchitecture;User=sa;Password=Your_password123;TrustServerCertificate=true;
生产环境部署配置
1. 创建生产环境Dockerfile
# 多阶段构建优化生产镜像
FROM mcr.azk8s.cn/dotnet/sdk:9.0 AS build
WORKDIR /src
COPY ["Directory.Build.props", "."]
COPY ["Directory.Packages.props", "."]
COPY ["nuget.config", "."]
COPY ["src/Clean.Architecture.Web/Clean.Architecture.Web.csproj", "src/Clean.Architecture.Web/"]
COPY ["src/Clean.Architecture.UseCases/Clean.Architecture.UseCases.csproj", "src/Clean.Architecture.UseCases/"]
COPY ["src/Clean.Architecture.Infrastructure/Clean.Architecture.Infrastructure.csproj", "src/Clean.Architecture.Infrastructure/"]
COPY ["src/Clean.Architecture.Core/Clean.Architecture.Core.csproj", "src/Clean.Architecture.Core/"]
COPY ["src/Clean.Architecture.ServiceDefaults/Clean.Architecture.ServiceDefaults.csproj", "src/Clean.Architecture.ServiceDefaults/"]
RUN dotnet restore "src/Clean.Architecture.Web/Clean.Architecture.Web.csproj"
COPY . .
WORKDIR "/src/src/Clean.Architecture.Web"
RUN dotnet publish -c Release -o /app/publish
FROM mcr.azk8s.cn/dotnet/aspnet:9.0 AS final
WORKDIR /app
COPY --from=build /app/publish .
# 添加健康检查
HEALTHCHECK --interval=30s --timeout=3s --start-period=5s --retries=3 \
CMD curl -f http://localhost:8080/health || exit 1
EXPOSE 8080
ENV ASPNETCORE_URLS=http://+:8080
ENTRYPOINT ["dotnet", "Clean.Architecture.Web.dll"]
2. 生产环境docker-compose.prod.yml
version: '3.8'
services:
web:
build:
context: .
dockerfile: Dockerfile.prod
ports:
- "80:8080"
environment:
- ASPNETCORE_ENVIRONMENT=Production
- ConnectionStrings__DefaultConnection=Server=db;Database=CleanArchitecture;User=sa;Password=${DB_PASSWORD};TrustServerCertificate=true;
deploy:
resources:
limits:
memory: 512M
reservations:
memory: 256M
healthcheck:
test: ["CMD", "curl", "-f", "http://localhost:8080/health"]
interval: 30s
timeout: 10s
retries: 3
start_period: 40s
db:
image: mcr.azk8s.cn/mssql/server:2022-latest
environment:
- ACCEPT_EULA=Y
- SA_PASSWORD=${DB_PASSWORD}
- MSSQL_PID=Express
volumes:
- sql_data:/var/opt/mssql
deploy:
resources:
limits:
memory: 1G
reservations:
memory: 512M
volumes:
sql_data:
networks:
default:
driver: bridge
环境变量配置
创建.env文件管理敏感信息:
# 数据库配置
DB_PASSWORD=Your_secure_password_123
DB_SERVER=db
DB_NAME=CleanArchitecture
# 应用配置
ASPNETCORE_ENVIRONMENT=Production
ASPNETCORE_URLS=http://+:8080
# 日志配置
SERILOG__MINIMUMLEVEL=Information
部署最佳实践
1. 安全配置
# 使用非root用户运行
RUN adduser -D -H -u 1000 appuser && \
chown -R appuser:appuser /app
USER appuser
2. 镜像优化策略
| 优化策略 | 实施方法 | 效果 |
|---|---|---|
| 多阶段构建 | 分离构建和运行环境 | 减少镜像大小 |
| 层缓存优化 | 合理安排COPY顺序 | 加快构建速度 |
| .dockerignore | 排除不必要的文件 | 减小构建上下文 |
3. 监控和日志
# 添加日志驱动
logging:
driver: "json-file"
options:
max-size: "10m"
max-file: "3"
故障排除指南
常见问题及解决方案
| 问题 | 原因 | 解决方案 |
|---|---|---|
| 容器启动失败 | 端口冲突 | 修改端口映射或停止占用端口的进程 |
| 数据库连接失败 | 连接字符串错误 | 检查环境变量和连接字符串配置 |
| 迁移失败 | 数据库权限不足 | 确保SA用户有足够权限 |
调试命令
# 进入容器调试
docker-compose exec web sh
# 查看容器日志
docker-compose logs -f web
# 检查容器状态
docker inspect <container_id>
# 查看资源使用情况
docker stats
总结
通过本文的Docker容器化指南,您可以:
- 快速部署:使用Docker Compose一键部署完整环境
- 环境一致性:确保开发、测试、生产环境完全一致
- 可扩展性:轻松扩展服务实例和数据库配置
- 便于维护:版本化部署配置,便于回滚和更新
CleanArchitecture结合Docker容器化技术,为现代.NET应用程序提供了企业级的部署解决方案,大大提升了开发效率和系统可靠性。
下一步建议:
- 集成CI/CD流水线实现自动化部署
- 配置SSL证书启用HTTPS
- 设置监控和告警系统
- 实现蓝绿部署或金丝雀发布
立即开始您的CleanArchitecture容器化之旅,享受现代化部署带来的便利和可靠性!
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考



