Docker Compose 部署.NET+SQL Server:多容器编排与网络配置
·
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)及日志收集配置。
更多推荐
所有评论(0)