CleanArchitecture容器化:Docker部署完整指南

CleanArchitecture容器化:Docker部署完整指南

【免费下载链接】CleanArchitecture CleanArchitecture 是一个基于.NET Core的应用程序模板项目,遵循干净架构原则。它为软件项目提供了一个清晰的分层结构,有助于分离关注点、提升可维护性和重用性。适合用于构建具有良好架构基础的中大型企业应用。 【免费下载链接】CleanArchitecture 项目地址: https://gitcode.com/GitHub_Trending/cl/CleanArchitecture

概述

CleanArchitecture是一个基于.NET 9.0的现代化应用程序模板,遵循干净架构原则。本文将详细介绍如何将CleanArchitecture项目容器化,使用Docker进行部署,实现开发、测试和生产环境的一致性。

项目架构分析

CleanArchitecture采用分层架构设计,主要包含以下核心组件:

mermaid

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容器化指南,您可以:

  1. 快速部署:使用Docker Compose一键部署完整环境
  2. 环境一致性:确保开发、测试、生产环境完全一致
  3. 可扩展性:轻松扩展服务实例和数据库配置
  4. 便于维护:版本化部署配置,便于回滚和更新

CleanArchitecture结合Docker容器化技术,为现代.NET应用程序提供了企业级的部署解决方案,大大提升了开发效率和系统可靠性。

下一步建议

  • 集成CI/CD流水线实现自动化部署
  • 配置SSL证书启用HTTPS
  • 设置监控和告警系统
  • 实现蓝绿部署或金丝雀发布

立即开始您的CleanArchitecture容器化之旅,享受现代化部署带来的便利和可靠性!

【免费下载链接】CleanArchitecture CleanArchitecture 是一个基于.NET Core的应用程序模板项目,遵循干净架构原则。它为软件项目提供了一个清晰的分层结构,有助于分离关注点、提升可维护性和重用性。适合用于构建具有良好架构基础的中大型企业应用。 【免费下载链接】CleanArchitecture 项目地址: https://gitcode.com/GitHub_Trending/cl/CleanArchitecture

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值