用途
该技能面向 .NET 多容器应用开发,围绕 Docker Compose 容器编排与开发环境搭建,提供可参考的配置与代码示例。适用于需要将 .NET 应用容器化、编排多个服务及其依赖、或搭建本地开发环境的场景。
主要能力
多阶段 Dockerfile(.NET 10)
提供多阶段构建示例:构建阶段使用 mcr.microsoft.com/dotnet/sdk:10.0,先复制解决方案与各项目文件以利用层缓存,再执行 dotnet restore 与 dotnet publish;运行阶段使用 mcr.microsoft.com/dotnet/aspnet:10.0,暴露 8080 端口,设置 ASPNETCORE_URLS 与 DOTNET_RUNNING_IN_CONTAINER 环境变量,并以非 root 用户 $APP_UID 运行,最后通过 ENTRYPOINT 启动应用。
Docker Compose(开发环境)
提供开发用 Compose 配置示例,包含以下服务:
- webapp:Blazor Web App,映射 5000:8080,配置数据库、Redis、RabbitMQ 连接字符串,依赖 postgres(健康检查通过后启动)与 redis,挂载开发 HTTPS 证书,加入 backend 网络。
- api:API 服务,映射 5001:8080,依赖 postgres。
- worker:Worker 服务,依赖 postgres 与 rabbitmq(均需健康检查通过)。
- postgres:使用
postgres:16-alpine,配置数据库、用户、密码,映射 5432,使用命名卷持久化,配置pg_isready健康检查。 - redis:使用
redis:7-alpine,映射 6379,使用命名卷持久化。 - rabbitmq:使用
rabbitmq:3-management-alpine,映射 5672(AMQP)与 15672(管理界面),配置默认用户密码,配置rabbitmq-diagnostics check_port_connectivity健康检查。 - 注释中提供 SQL Server 作为 PostgreSQL 的替代方案示例。
同时定义命名卷 postgres_data、redis_data 与桥接网络 backend。
集成事件总线(RabbitMQ)
提供跨服务边界的集成事件示例(OrderPaymentSucceededIntegrationEvent)、事件总线接口 IEventBus(含 PublishAsync 与 Subscribe 方法)以及集成事件处理器示例(OrderPaymentSucceededHandler,通过仓储更新订单支付状态并保存)。
API 网关模式
提供使用 YARP(Yet Another Reverse Proxy)实现网关的示例:通过 AddReverseProxy().LoadFromConfig(...) 加载配置并 MapReverseProxy()。同时给出 appsettings.json 中 ReverseProxy 的路由与集群配置示例,将 /api/catalog/{**catch-all} 与 /api/orders/{**catch-all} 分别转发到对应后端服务地址。
.NET Docker 镜像对照
| 镜像 | 用途 | 大小 |
|---|---|---|
| mcr.microsoft.com/dotnet/sdk:10.0 | 仅构建阶段 | ~800MB |
| mcr.microsoft.com/dotnet/aspnet:10.0 | Web 应用、API | ~220MB |
| mcr.microsoft.com/dotnet/runtime:10.0 | 控制台/Worker 应用 | ~190MB |
| mcr.microsoft.com/dotnet/runtime-deps:10.0 | 自包含 AOT | ~110MB |
使用方式
资料以配置与代码示例形式呈现,未提供安装命令或具体调用步骤。使用者可参考其中的 Dockerfile、docker-compose 配置、事件总线接口与 YARP 配置,结合自身项目结构调整后使用。
适用场景
- 将 .NET Web 应用、API、Worker 服务容器化。
- 使用 Docker Compose 编排应用服务与 PostgreSQL、Redis、RabbitMQ 等依赖。
- 搭建包含数据库、缓存、消息队列的本地开发环境。
- 在微服务间通过 RabbitMQ 实现集成事件通信。
- 使用 YARP 实现 API 网关路由。
限制
资料未提供该技能的安装方式、运行命令、收费信息、平台限制或效果说明,这些内容暂未提供。示例中的镜像版本、端口、密码等均为示例值,实际使用需按项目情况调整。