Docker Compose 部署 .NET + SQL Server:多容器编排与网络配置

使用 Docker Compose 可高效管理 .NET 应用与 SQL Server 的协同部署。以下是完整实现方案:


1. 核心架构
  • 容器组成
    • .NET 应用容器:运行 ASP.NET Core 应用
    • SQL Server 容器:提供数据库服务
  • 网络模型
    • 创建自定义桥接网络 app-network
    • 确保容器通过服务名直接通信(如 db 访问数据库)

2. 文件结构
project-root/
├── app/
│   ├── Dockerfile          # .NET 应用镜像构建
│   └── ...                # 应用源代码
├── docker-compose.yml      # 编排配置文件
└── .env                    # 环境变量文件


3. 配置文件实现
(1) .NET 应用 Dockerfile
FROM mcr.microsoft.com/dotnet/sdk:7.0 AS build
WORKDIR /src
COPY . .
RUN dotnet publish -c Release -o /app

FROM mcr.microsoft.com/dotnet/aspnet:7.0
WORKDIR /app
COPY --from=build /app .
ENTRYPOINT ["dotnet", "YourApp.dll"]

(2) 环境变量文件 (.env)
SA_PASSWORD=YourStrong!Passw0rd
DB_NAME=AppDatabase

(3) docker-compose.yml
version: '3.8'

services:
  webapp:
    build: ./app
    ports:
      - "8080:80"
    environment:
      - ConnectionStrings__DefaultConnection=Server=db;Database=${DB_NAME};User=sa;Password=${SA_PASSWORD};
    networks:
      - app-network
    depends_on:
      - db

  db:
    image: mcr.microsoft.com/mssql/server:2022-latest
    environment:
      - ACCEPT_EULA=Y
      - SA_PASSWORD=${SA_PASSWORD}
      - MSSQL_DATABASE=${DB_NAME}
    volumes:
      - sql-data:/var/opt/mssql
    networks:
      - app-network

networks:
  app-network:
    driver: bridge

volumes:
  sql-data:


4. 关键配置解析
组件配置项作用
网络app-network容器间私有通信网络,隔离外部访问
数据库volumes: sql-data持久化存储数据库文件,避免容器重启数据丢失
依赖控制depends_on: db确保数据库容器先启动
连接字符串ConnectionStrings__*.NET 应用通过 Server=db 访问数据库(db 为服务名)
安全.env 文件隔离敏感信息(密码等),避免硬编码

5. 部署操作流程
# 启动所有服务
docker-compose up -d

# 查看运行状态
docker-compose ps

# 停止并清理
docker-compose down -v


6. 验证通信

在 .NET 应用中添加健康检查端点:

app.MapGet("/health", () => 
    Results.Ok("DB connection successful"));

访问 http://localhost:8080/health 返回成功即表明容器间网络通信正常。


7. 常见问题解决
问题解决方案
数据库连接超时增加 depends_on 条件 + 应用重试机制
SA 密码强度不足密码需满足:长度≥8,含大小写字母+数字+符号(参考 .env 文件)
跨容器 DNS 解析失败确认容器在同一网络,使用 docker network inspect app-network 检查连接状态
数据卷权限错误在 Linux 宿主机构建时,添加 USER root 到 Dockerfile

提示:生产环境需添加 HTTPS 证书、资源限制(cpus, mem_limit)及日志收集配置。

更多推荐