介绍:为什么要容器化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 --version1.2. .NET项目结构
假设我们有一个简单的ASP.NET Core Web API应用程序。文件夹结构:
MyApp/├── MyApp.csproj├── Program.cs├── Controllers/│ └── WeatherController.cs└── Dockerfile2. 为.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.md3.4. 优化后的Dockerfile示例
FROM mcr.microsoft