在C#本地开发过程中,当项目需要同时运行Web应用、数据库、缓存等多个服务时,手动逐个启动容器会非常繁琐。Docker Compose可以通过一个配置文件统一管理所有容器,实现一键启动、停止整个服务集群,非常适合多容器开发场景。

基础环境准备
首先需要确保本地已经安装Docker Desktop,并且开启了Docker Compose功能。如果是.NET项目,建议提前安装好对应的.NET SDK,方便本地调试。接下来我们以一个简单的C# Web API项目为例,演示完整的配置流程。
编写Dockerfile
在C#项目根目录下创建Dockerfile,用于构建应用镜像,示例内容如下:
# 使用官方.NET SDK镜像作为构建阶段 FROM mcr.microsoft.com/dotnet/sdk:8.0 AS build WORKDIR /app # 复制项目文件并还原依赖 COPY *.csproj ./ RUN dotnet restore # 复制所有文件并构建发布版本 COPY . . RUN dotnet publish -c Release -o out # 使用运行时镜像作为最终阶段 FROM mcr.microsoft.com/dotnet/aspnet:8.0 WORKDIR /app COPY --from=build /app/out . ENTRYPOINT ["dotnet", "WebApi.dll"]
配置docker-compose.yml
在项目根目录创建docker-compose.yml文件,定义多容器服务,示例配置如下:
version: '3.8'
services:
# C# Web API服务
webapi:
build:
context: .
dockerfile: Dockerfile
ports:
- "5000:80"
environment:
- ConnectionStrings__Default=Server=db;Database=TestDb;User Id=sa;Password=YourStrong@Passw0rd;
- Redis__Connection=redis:6379
depends_on:
- db
- redis
networks:
- app-network
# SQL Server数据库服务
db:
image: mcr.microsoft.com/mssql/server:2022-latest
environment:
- ACCEPT_EULA=Y
- SA_PASSWORD=YourStrong@Passw0rd
ports:
- "1433:1433"
volumes:
- sql-data:/var/opt/mssql
networks:
- app-network
# Redis缓存服务
redis:
image: redis:7-alpine
ports:
- "6379:6379"
volumes:
- redis-data:/data
networks:
- app-network
# 定义共享网络
networks:
app-network:
driver: bridge
# 定义持久化卷
volumes:
sql-data:
redis-data:
配置项说明
- version:指定Docker Compose文件格式版本,这里使用3.8兼容大部分新特性
- services:定义所有需要运行的服务,每个服务对应一个容器
- build:指定构建镜像的上下文和Dockerfile路径,用于C#应用服务
- image:直接使用已有的公共镜像,比如数据库和缓存服务
- ports:映射宿主机端口和容器端口,格式为宿主机端口:容器端口
- environment:设置容器内的环境变量,C#应用可以通过
IConfiguration读取这些配置 - depends_on:指定服务启动依赖,确保db和redis先于webapi启动
- networks:将服务加入同一个自定义网络,实现容器间通过服务名通信
- volumes:挂载数据卷,实现数据持久化,避免容器删除后数据丢失
启动与调试
配置完成后,在项目根目录执行以下命令启动所有服务:
# 启动所有服务,-d表示后台运行 docker-compose up -d # 查看服务运行状态 docker-compose ps # 查看某个服务的日志 docker-compose logs webapi
如果需要停止所有服务,执行以下命令:
# 停止并删除容器、网络 docker-compose down # 停止并删除容器、网络、数据卷 docker-compose down -v
本地开发调试技巧
如果需要在本地调试C#代码,可以不用构建镜像,直接修改docker-compose.yml中webapi服务的配置,将本地项目目录挂载到容器中,同时映射调试端口:
webapi:
image: mcr.microsoft.com/dotnet/aspnet:8.0
ports:
- "5000:80"
- "5001:443"
volumes:
- ./:/app
working_dir: /app
command: dotnet watch run --urls=http://+:80
environment:
- ConnectionStrings__Default=Server=db;Database=TestDb;User Id=sa;Password=YourStrong@Passw0rd;
- Redis__Connection=redis:6379
depends_on:
- db
- redis
networks:
- app-network
这样修改本地代码后,容器内的应用会自动重启,方便实时调试。注意这种方式仅用于本地开发,生产环境还是需要使用构建好的镜像。
常见问题处理
容器间无法通信:检查所有服务是否加入了同一个自定义网络,Docker Compose默认会为每个项目创建独立网络,不同项目的服务如果没有加入同一个网络无法直接通信。
SQL Server启动失败:检查SA密码是否符合复杂度要求,必须包含大小写字母、数字和特殊字符,长度至少8位。
端口被占用:启动时报端口已被占用的错误,可以修改ports映射的宿主机端口,比如把5000改成5001,重新启动即可。
C#Docker_Composedocker-compose.yml多容器开发修改时间:2026-07-22 06:12:26