Docker与C#:.NET应用程序容器化完整指南
容器化已成为部署现代应用程序的事实标准。如果您使用C#(.NET)进行开发,Docker允许您将应用程序及其所有依赖项打包到轻量级、隔离的容器中。在本文中,我们将从创建简单的Dockerfile到发布和运行完整镜像,一步步引导您。您将学习如何容器化C#应用程序、优化镜像大小并运用最佳实践。
1. .NET开发者的Docker基础
Docker是一个用于在容器中开发、交付和运行应用程序的平台。容器是标准化的软件单元,包含代码及其所有依赖项。与虚拟机不同,容器共享操作系统内核,因此更快、更轻量。
对于C#(.NET),Docker尤其有用,因为它解决了“在我机器上能运行”的问题——您能确保应用程序在开发机、测试服务器和生产环境中行为一致。主要组件包括:
- Docker Engine — 容器运行时环境
- Dockerfile — 包含构建镜像指令的文本文件
- 镜像(Image) — 用于创建容器的不可变模板
- 容器(Container) — 镜像的运行实例
请安装适用于Windows/Mac的Docker Desktop或适用于Linux的Docker Engine。安装后,使用以下命令验证:
docker --version2. 为C#(.NET)应用程序创建Dockerfile
我们从创建一个简单的ASP.NET Core Web API应用程序开始。新建项目:
dotnet new webapi -n MyDockerAppcd MyDockerApp现在,在项目根目录创建Dockerfile(无扩展名)。以下是使用多阶段构建的基础版本:
# 阶段1:构建应用程序FROM mcr.microsoft.com/dotnet/sdk:8.0 AS buildWORKDIR /src
# 复制csproj并还原依赖项COPY ["MyDockerApp.csproj", "."]RUN dotnet restore
# 复制其余代码并编译项目COPY . .RUN dotnet publish -c Release -o /app/publish
# 阶段2:创建用于运行的最小镜像FROM mcr.microsoft.com/dotnet/aspnet:8.0 AS runtimeWORKDIR /appEXPOSE 80EXPOSE 443
# 从第一阶段复制编译好的应用程序COPY --from=build /app/publish .
# 入口点ENTRYPOINT ["dotnet", "MyDockerApp.dll"]关键指令说明:
FROM— 指定基础镜像(构建用SDK,运行用ASP.NET)WORKDIR— 设置工作目录COPY— 将构建上下文中的文件复制到镜像RUN dotnet restore— 还原NuGet包RUN dotnet publish— 编译并发布应用程序EXPOSE— 声明容器监听的端口ENTRYPOINT— 容器启动时执行的命令
多阶段构建对C#至关重要:最终镜像仅包含运行时和您的应用程序,不含SDK和源代码。这可将镜像大小从约1.5 GB减小到约200 MB。
3. 构建并运行容器
构建Docker镜像:
docker build -t my-dotnet-app:latest .-t标志指定标签(名称:版本)。末尾的点表示当前目录为构建上下文。
运行容器:
docker run -d -p 8080:80 --name my-app my-dotnet-app:latest参数说明:
-d— 后台运行(分离模式)-p 8080:80— 端口映射:主机端口8080