Docker 和 C#:.NET 应用程序的容器化
在现代软件开发中,容器化已成为创建、测试和部署应用程序的事实标准。Docker 允许您将 C# 应用程序及其所有依赖项打包到一个隔离环境——容器中。这确保了应用程序在从开发人员笔记本电脑到云中生产服务器的任何机器上都能以相同方式运行。
在本文中,我们将详细介绍如何使用 Docker 容器化 .NET 应用程序。您将学习如何创建高效的 Dockerfile、使用多阶段构建、使用 docker-compose 处理多容器应用程序以及遵循最佳实践。
什么是 Docker,为什么 C# 开发人员需要它?
Docker 是一个用于在容器中开发、交付和运行应用程序的平台。容器是一个轻量级、独立、可执行的软件包,其中包含运行应用程序所需的一切:代码、运行时、系统工具、库和设置。
对于 C# 开发人员来说,Docker 提供了以下优势:
- 环境隔离 — 不再需要在每台机器上配置环境。所有依赖项都固定在镜像中。
- 统一性 — 应用程序在 Windows、Linux 和 macOS 上运行方式相同。
- 可扩展性 — 轻松运行多个应用程序实例以处理负载。
- CI/CD 集成 — 容器非常适合自动构建和部署流水线。
- 微服务架构 — 每个服务都可以打包到单独的容器中。
值得注意的是,.NET Core(以及更新的 .NET 5/6/7/8)是跨平台的,并且在作为 Docker 标准的 Linux 容器中运行良好。.NET Framework 应用程序需要 Windows 容器,这会带来某些限制。
为 .NET 应用程序创建 Dockerfile
容器化的主要工件是 Dockerfile 文件。它包含构建应用程序镜像的指令。让我们看一个典型 ASP.NET Core Web API 的示例。
在项目根目录中创建一个 Dockerfile 文件:
# 阶段 1:构建应用程序FROM mcr.microsoft.com/dotnet/sdk:8.0 AS buildWORKDIR /src
# 复制项目文件并还原依赖项COPY ["MyApp/MyApp.csproj", "MyApp/"]RUN dotnet restore "MyApp/MyApp.csproj"
# 复制所有源代码并构建应用程序COPY . .WORKDIR "/src/MyApp"RUN dotnet build "MyApp.csproj" -c Release -o /app/build
# 阶段 2:发布应用程序FROM build AS publishRUN dotnet publish "MyApp.csproj" -c Release -o /app/publish /p:UseAppHost=false
# 阶段 3:用于运行的最终镜像FROM mcr.microsoft.com/dotnet/aspnet:8.0 AS finalWORKDIR /appEXPOSE 80EXPOSE 443
# 从发布阶段复制已发布的文件COPY --from=publish /app/publish .
# 为安全起见设置非 root 用户USER app
ENTRYPOINT ["dotnet", "MyApp.dll"]指令解析:
FROM ... AS build— 使用 SDK 镜像进行构建。这是“构建”阶段。WORKDIR— 设置工作目录。COPY— 将文件从主机系统复制到镜像中。RUN dotnet restore— 还原 NuGet 包。RUN dotnet build— 编译项目。FROM ... AS publish— 用于发布的第二阶段(通常与构建阶段合并)。FROM mcr.microsoft.com/dotnet/aspnet:8.0 AS final— 仅包含 ASP.NET Core 运行时的最终镜像。它比 SDK 镜像轻量得多。COPY --from=— 从之前的阶段复制文件。