.NET 与 Docker 集成实践:2018 年生态演进与工程化落地
自 2017 年 .NET 容器化实践普及以来,微软与 Docker 社区协同推进了跨平台容器支持能力。随着 DockerCon 2018 的召开,.NET 在开发、持续集成与生产部署三大场景中的容器化方案已趋于成熟,覆盖 Windows Server Containers、Linux Containers 及混合环境,并显著扩展了官方镜像体系与工具链支持。
容器技术正成为 .NET 应用交付的标准范式——其核心优势在于环境一致性、启动速度与资源效率。相比传统虚拟机,容器消除了操作系统冗余层,在 CI/CD 流水线和云原生架构中展现出更高适配性。在本次大会中,多个案例展示了如何将 ASP.NET Core 微服务与遗留的 .NET Framework WebForms 应用统一纳入容器编排体系,借助 Visual Studio 和 CLI 工具实现端到端自动化。
快速体验容器化 .NET 应用
官方维护的示例仓库提供开箱即用的验证路径:
- 轻量级入门:运行预构建的 .NET Core 控制台镜像(兼容 Linux/macOS/Windows)
docker run --rm mcr.microsoft.com/dotnet/samples
- 全栈演示:包含 ASP.NET Core MVC、Web API 及 .NET Framework Web Forms 的完整示例集
三大核心使用模式
Docker 在 .NET 工程实践中主要服务于三类目标:
- 构建阶段:源码编译与镜像生成
- 验证阶段:跨平台二进制兼容性测试
- 运行阶段:生产环境服务托管
多数团队从运行阶段切入,逐步向构建与测试环节延伸。这种渐进式采用策略降低了初期迁移成本,同时确保关键业务稳定性。
基于二进制构建镜像(Production-First)
适用于已有稳定构建产物的场景,强调环境一致性:
FROM mcr.microsoft.com/dotnet/runtime:6.0
WORKDIR /srv/app
COPY ./publish/ .
ENTRYPOINT ["dotnet", "MyService.dll"]
构建与运行命令:
docker build -t myservice:v1 .
docker run --rm -p 5000:80 myservice:v1
多阶段构建(Source-to-Image)
利用 Docker 层缓存加速增量编译,消除本地环境依赖:
# 构建阶段
FROM mcr.microsoft.com/dotnet/sdk:6.0 AS builder
WORKDIR /src
COPY *.sln .
COPY MyWebApp/*.csproj ./MyWebApp/
RUN dotnet restore
COPY MyWebApp/. ./MyWebApp/
WORKDIR /src/MyWebApp
RUN dotnet publish -c Release -o /app/publish
# 运行阶段
FROM mcr.microsoft.com/dotnet/aspnet:6.0
WORKDIR /app
COPY --from=builder /app/publish .
ENTRYPOINT ["dotnet", "MyWebApp.dll"]
启用自动镜像更新:
docker build --pull --target final -t mywebapp:prod .
容器化单元测试
为规避构建失败中断流水线、支持测试结果持久化,推荐使用 docker run 执行测试:
FROM mcr.microsoft.com/dotnet/sdk:6.0 AS testrunner
WORKDIR /test
COPY *.csproj .
RUN dotnet restore
COPY . .
RUN dotnet test --logger:"trx;LogFileName=test-results.trx" --results-directory /test/output
挂载宿主机目录保存测试报告:
docker run --rm -v $(pwd)/TestResults:/test/output myapp:test
容器内开发工作流
通过卷映射实现代码热重载,支持 VS Code 或命令行开发:
docker run -it --rm \
-p 5000:80 \
-v ${PWD}:/workspace \
-w /workspace \
mcr.microsoft.com/dotnet/sdk:6.0 \
dotnet watch run
该模式将本地源码实时同步至容器,配合 dotnet watch 实现修改即生效,大幅缩短调试反馈周期。
HTTPS 容器化部署
在容器中启用 HTTPS 需注入证书并配置 Kestrel:
# 生成开发证书(仅限开发环境)
dotnet dev-certs https -ep ./https/localhost.pfx -p "SecurePass123!"
dotnet dev-certs https --trust
# 启动容器并挂载证书
docker run -d \
-p 80:80 -p 443:443 \
-e ASPNETCORE_URLS="https://+;http://+" \
-e ASPNETCORE_HTTPS_PORT=443 \
-e ASPNETCORE_Kestrel__Certificates__Default__Password="SecurePass123!" \
-v $(pwd)/https:/https \
-e ASPNETCORE_Kestrel__Certificates__Default__Path=/https/localhost.pfx \
mywebapp:secure
镜像治理与版本控制
建议采用以下策略管理镜像生命周期:
- 使用 MCR(Microsoft Container Registry) 替代已弃用的 Docker Hub 镜像
- 遵循语义化版本标签(如
6.0-alpine、8.0-jammy) - 对生产镜像启用内容信任(Notary)与漏洞扫描(Trivy/Aqua)