Docker与C#:从零开始实现.NET应用的容器化

面向初学者的在线Python训练器

轻松学习Python,无需理论负担。在浏览器中直接解决带自动检查的实践任务,无需安装任何东西。

开始课程

介绍:为什么要容器化C#应用程序?

现代C#(.NET)开发很少能离开Docker。容器化允许将应用程序及其所有依赖项、运行时环境和配置打包到隔离的镜像中。这解决了"在我机器上能运行"的问题,并简化了部署到服务器、云或本地基础设施的过程。

在本文中,我们将分析如何为.NET应用程序(ASP.NET Core或控制台应用程序)创建Docker镜像,优化其大小,使用docker-compose与数据库集成,并配置CI/CD。所有代码示例均用C#编写,可直接使用。



1. .NET开发者的Docker基础

Docker是一个在容器中运行应用程序的平台。容器包含所有必要内容:代码、运行时环境、库和配置。这对.NET特别方便,因为您无需在服务器上安装.NET SDK——只需Docker即可。



1.1. 安装Docker

从官方网站下载并安装Docker Desktop。安装后检查版本:

docker --version


1.2. .NET项目结构

假设我们有一个简单的ASP.NET Core Web API应用程序。文件夹结构:

MyApp/├── MyApp.csproj├── Program.cs├── Controllers/│   └── WeatherController.cs└── Dockerfile


2. 为.NET应用程序创建Dockerfile

Dockerfile是构建镜像的指令。对于.NET,建议使用多阶段构建(multi-stage build)来分离构建和执行阶段。这能减小最终镜像的大小。



2.1. 基础Dockerfile

在项目根目录创建Dockerfile文件:

# 构建阶段FROM mcr.microsoft.com/dotnet/sdk:8.0 AS buildWORKDIR /srcCOPY ["MyApp.csproj", "."]RUN dotnet restoreCOPY . .RUN dotnet publish -c Release -o /app/publish

# 运行阶段FROM mcr.microsoft.com/dotnet/aspnet:8.0 AS runtimeWORKDIR /appCOPY --from=build /app/publish .EXPOSE 80ENTRYPOINT ["dotnet", "MyApp.dll"]

说明:

  • FROM ... AS build — 使用SDK进行编译。
  • COPY ["MyApp.csproj", "."] — 仅复制项目文件以缓存restore。
  • RUN dotnet restore — 恢复NuGet包。
  • RUN dotnet publish — 构建发布版本。
  • FROM ... AS runtime — 使用最小的aspnet镜像。
  • EXPOSE 80 — 开放80端口。
  • ENTRYPOINT — 应用程序启动命令。


2.2. 构建和运行镜像

在项目文件夹的终端中执行命令:

docker build -t myapp:latest .docker run -d -p 8080:80 --name myapp_container myapp:latest

现在应用程序可通过http://localhost:8080访问。



3. 优化.NET的Docker镜像

大镜像会减慢部署速度并消耗资源。以下是几个优化实践:



3.1. 使用.NET 8(或更新版本)

新版本的.NET内置支持AOT(Ahead-of-Time)编译,可减小运行时大小。对于ASP.NET Core,使用aspnet:8.0镜像。



3.2. 最小化层数

每个RUN、COPY指令都会创建一个层。合并命令:

RUN apt-get update && apt-get install -y \    curl \    && rm -rf /var/lib/apt/lists/*


3.3. 使用.dockerignore

在项目根目录创建.dockerignore文件,排除不需要的文件:

bin/obj/.vs/*.user.git/README.md


3.4. 优化后的Dockerfile示例

FROM mcr.microsoft                

博客

书籍推荐