You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用Docker Compose创建Multi-Container ASP.NET Core应用

用Docker Compose创建多容器ASP.NET Core应用实操指南

以下为生产可用的全流程实操步骤,覆盖配置、镜像构建、编排、部署全环节:


1. 前置准备

  • 本地环境需安装.NET LTS版SDK(推荐6.0/8.0)、Docker Desktop、Docker Compose
  • 本次以最常用的「ASP.NET Core Web API + PostgreSQL数据库 + Redis缓存」架构举例,其他服务(如RabbitMQ、Nginx反向代理)可按相同规则扩展

2. 项目配置调整

先修改项目代码适配容器化运行:

  • 连接字符串、敏感配置全部从环境变量读取,禁止硬编码,修改appsettings.json:
    "ConnectionStrings": {
      "DefaultConnection": "Host=${DB_HOST};Database=${DB_NAME};Username=${DB_USER};Password=${DB_PWD}",
      "Redis": "${REDIS_HOST}:6379"
    }
    
  • 关闭非开发环境的强制HSTS跳转,容器内不需要处理HTTPS,统一由外层反向代理实现,修改Program.cs:
    if (!builder.Environment.IsDevelopment())
    {
        builder.Services.AddHsts();
    }
    
  • .NET 6及更低版本需手动指定监听端口,避免容器权限问题,在Program.cs添加:
    builder.WebHost.UseUrls("http://*:8080");
    

3. Dockerfile编写

在ASP.NET Core项目根目录(和.csproj同级)新建Dockerfile,用分层构建最大化利用镜像缓存、减小镜像体积:

# 构建层:用SDK镜像编译代码
FROM mcr.microsoft.com/dotnet/sdk:8.0 AS build
WORKDIR /src
# 先复制项目文件还原依赖,只要.csproj不变就不会重复执行还原
COPY ["YourWebApi.csproj", "./"]
RUN dotnet restore "YourWebApi.csproj"
# 复制全量代码构建
COPY . .
WORKDIR "/src/."
RUN dotnet build "YourWebApi.csproj" -c Release -o /app/build

# 发布层:生成正式发布包
FROM build AS publish
RUN dotnet publish "YourWebApi.csproj" -c Release -o /app/publish /p:UseAppHost=false

# 运行层:用轻量运行时镜像,只保留运行必需的文件
FROM mcr.microsoft.com/dotnet/aspnet:8.0 AS base
WORKDIR /app
EXPOSE 8080
# 用官方内置普通用户运行,避免root权限安全风险
USER $APP_UID
COPY --from=publish /app/publish .
ENTRYPOINT ["dotnet", "YourWebApi.dll"]

同目录新增.dockerignore文件,排除不需要复制到镜像的内容:

bin/
obj/
.git/
.gitignore
.dockerignore
Dockerfile
appsettings.*.json

4. Docker Compose服务编排规则

在解决方案根目录(和.sln同级)新建docker-compose.yml文件,定义所有服务的运行规则:

version: '3.8'

services:
  # ASP.NET Core Web API服务
  webapi:
    build: ./YourWebApi # 指向WebAPI项目的目录,会自动读取目录下的Dockerfile构建
    ports:
      - "5000:8080" # 宿主机5000端口映射到容器8080端口
    environment:
      - ASPNETCORE_ENVIRONMENT=Production
      - DB_HOST=postgres # 直接写数据库服务名,Docker内部DNS会自动解析,不用填IP
      - DB_NAME=appdb
      - DB_USER=postgres
      - DB_PWD=YourStrongPass@123
      - REDIS_HOST=redis
    depends_on:
      - postgres
      - redis
    restart: unless-stopped # 异常退出自动重启,手动停止才会关闭

  # PostgreSQL数据库服务
  postgres:
    image: postgres:15-alpine
    environment:
      - POSTGRES_DB=appdb
      - POSTGRES_USER=postgres
      - POSTGRES_PASSWORD=YourStrongPass@123
    volumes:
      - postgres_data:/var/lib/postgresql/data # 用数据卷持久化数据库数据,容器删除数据不丢失
    restart: unless-stopped
    # 不需要对外暴露端口,仅允许同网络内的webapi访问,提升安全性

  # Redis缓存服务
  redis:
    image: redis:7-alpine
    volumes:
      - redis_data:/data
    restart: unless-stopped

# 声明全局数据卷,会自动创建管理
volumes:
  postgres_data:
  redis_data:

编排核心注意点

  • depends_on仅控制服务启动顺序,不会等待依赖服务内部进程完全就绪,比如PostgreSQL启动后初始化还没完成,WebAPI这时候连接会报错,要么在WebAPI里加数据库连接重试逻辑,要么用wait-for类脚本等待依赖服务就绪再启动
  • 敏感信息不要直接写在yml文件中,生产环境用docker-compose.override.yml或者.env文件存储敏感值,并且.env必须加到.gitignore中避免提交到代码库
  • 服务间内部调用直接使用服务名作为域名即可,Docker Compose默认会创建专属内部网络,所有服务在同一网络内可互相访问,不需要配置IP

5. 本地运行测试

  • 进入docker-compose.yml所在目录,执行docker-compose up -d即可后台启动所有服务
  • 执行docker-compose ps查看所有服务状态,确认状态为Up即为启动成功
  • 访问http://localhost:5000/你的接口路由测试功能正常性
  • 查看服务日志执行docker-compose logs webapi(替换成要查看的服务名)
  • 停止服务执行docker-compose down,需要同时删除本地数据卷可加-v参数(禁止在生产环境使用)

6. 生产部署注意事项

  • 所有镜像必须固定版本号,不要用latest标签,避免镜像更新后出现兼容性问题
  • 不要直接把WebAPI端口暴露到公网,外层要加Nginx等反向代理,统一处理HTTPS、限流、静态资源分发等逻辑
  • 多实例部署时,不要把会话、缓存存在服务本地内存中,全部存入Redis这类分布式缓存,避免实例间数据不一致
  • 日志不要存储在容器内部,统一输出到控制台,用Docker日志驱动收集到ELK等统一日志平台
  • 数据库等有状态服务不要随意扩缩容,单独配置定期备份策略,定期备份数据卷内容
  • 容器内部不要用root用户运行,官方ASP.NET Core镜像内置的普通用户已经足够权限运行服务

内容的提问来源于stack exchange,提问作者Mehmet Topçu

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.05 20:15:03