编辑
2025-09-20
C#
00

目录

🎯 为什么要学Docker容器化?
痛点分析
Docker的价值
🔥 实战案例:构建你的第一个.NET 8 Docker应用
编写示例代码
创建高效Dockerfile
🔥 Dockerfile最佳实践详解
第四步:构建和运行
💡 进阶技巧:Docker开发最佳实践
🛠️ 优化Dockerfile性能
🔧 本地开发调试技巧
📊 性能对比数据
🚀 总结:三个关键收获
💬 互动时间

使用 Docker 构建 .NET 8应用,你一招Docker容器化,让你的.NET 8应用一次构建,到处运行,彻底告别"在我机器上能跑"的尴尬!

🎯 为什么要学Docker容器化?

痛点分析

作为C#开发者,你一定遇到过这些问题:

  • 环境依赖地狱:不同机器.NET版本不一致
  • 部署复杂:每次发布都要配置一大堆环境
  • 团队协作困难:新人入职光搭环境就要半天
  • 生产环境事故:开发环境正常,生产环境出bug

Docker的价值

环境一致性:开发、测试、生产完全相同的运行环境

快速部署:打包一次,任何地方都能运行

资源隔离:不同应用互不干扰

版本管理:镜像版本化,回滚轻松搞定

🔥 实战案例:构建你的第一个.NET 8 Docker应用

编写示例代码

打开Program.cs,写一个更实用的示例:

C#
namespace AppDocker { internal class Program { static async Task Main(string[] args) { // 应用启动信息 Console.WriteLine("🚀 .NET 8 Docker应用启动成功!"); Console.WriteLine($"⏰ 启动时间: {DateTime.Now:yyyy-MM-dd HH:mm:ss}"); Console.WriteLine($"🖥️ 运行环境: {Environment.OSVersion}"); Console.WriteLine($"📁 工作目录: {Environment.CurrentDirectory}"); // 模拟业务逻辑处理 await ProcessBusinessLogic(); Console.WriteLine("✅ 应用执行完成!"); } /// <summary> /// 模拟业务逻辑处理 /// </summary> static async Task ProcessBusinessLogic() { Console.WriteLine("🔄 开始处理业务逻辑..."); // 模拟异步操作 for (int i = 1; i <= 3; i++) { Console.WriteLine($"📊 处理任务 {i}/3"); await Task.Delay(1000); // 模拟耗时操作 } Console.WriteLine("🎉 业务逻辑处理完成!"); } } }

我们正常编译运行如下

image.png

创建高效Dockerfile

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

我一般是将这个文件放在.sln文件同级,这块与系统给目录不同。

Docker
# See https://aka.ms/customizecontainer to learn how to customize your debug container and how Visual Studio uses this Dockerfile to build your images for faster debugging. # This stage is used when running from VS in fast mode (Default for Debug configuration) FROM mcr.microsoft.com/dotnet/runtime:8.0 AS base USER $APP_UID WORKDIR /app # This stage is used to build the service project FROM mcr.microsoft.com/dotnet/sdk:8.0 AS build ARG BUILD_CONFIGURATION=Release WORKDIR /src COPY ["AppDocker/AppDocker.csproj", "AppDocker/"] RUN dotnet restore "AppDocker/AppDocker.csproj" COPY . . WORKDIR "/src/AppDocker" RUN dotnet build "AppDocker.csproj" -c $BUILD_CONFIGURATION -o /app/build # This stage is used to publish the service project to be copied to the final stage FROM build AS publish ARG BUILD_CONFIGURATION=Release RUN dotnet publish "./AppDocker.csproj" -c $BUILD_CONFIGURATION -o /app/publish /p:UseAppHost=false # This stage is used in production or when running from VS in regular mode (Default when not using the Debug configuration) FROM base AS final WORKDIR /app COPY --from=publish /app/publish . ENTRYPOINT ["dotnet", "AppDocker.dll"]

🔥 Dockerfile最佳实践详解

多阶段构建的优势:

  • 📦 镜像体积小:运行时镜像只包含必要文件,减少70%体积
  • 🔒 安全性高:生产环境不包含源码和构建工具
  • 启动速度快:精简的运行时环境,启动更迅速

缓存优化技巧:

Docker
# ❌ 错误做法:每次代码变更都要重新restore COPY . ./ RUN dotnet restore # ✅ 正确做法:利用Docker层缓存 COPY *.csproj ./ RUN dotnet restore COPY . ./

第四步:构建和运行

Bash
# 构建Docker镜像 docker build -t appdocker:latest . # 运行容器 docker run --rm appdocker:latest

image.png

期望输出:

Markdown
🚀 .NET 8 Docker应用启动成功! ⏰ 启动时间: 2025-08-05 22:44:55 🖥️ 运行环境: Unix 5.15.167.4 📁 工作目录: /app 🔄 开始处理业务逻辑... 📊 处理任务 1/3 📊 处理任务 2/3 📊 处理任务 3/3 🎉 业务逻辑处理完成! ✅ 应用执行完成!

💡 进阶技巧:Docker开发最佳实践

🛠️ 优化Dockerfile性能

Docker
# 1. 使用.dockerignore文件排除不必要文件 # 创建.dockerignore文件,内容如下: bin/ obj/ *.md .git/ .vs/ # 2. 设置合适的环境变量 ENV DOTNET_RUNNING_IN_CONTAINER=true ENV ASPNETCORE_URLS=http://+:80 # 3. 非root用户运行(安全考虑) RUN adduser --disabled-password --gecos '' appuser USER appuser

🔧 本地开发调试技巧

Bash
# 1. 挂载源码目录,实时调试 docker run -it --rm -v $(pwd):/app -w /app mcr.microsoft.com/dotnet/sdk:8.0 bash # 2. 端口映射(适用于Web应用) docker run -p 8080:80 --rm mydotnetapp:latest # 3. 环境变量传递 docker run -e ENVIRONMENT=Development --rm mydotnetapp:latest

📊 性能对比数据

部署方式部署时间环境一致性回滚速度资源占用
传统部署30分钟+❌ 困难60分钟+
Docker部署5分钟✅ 完美30秒

🚀 总结:三个关键收获

  1. 环境标准化:Docker彻底解决"在我机器上能跑"的问题,实现开发、测试、生产环境100%一致
  2. 部署自动化:一条命令完成应用部署,从传统的30分钟部署流程缩短到5分钟
  3. 运维简化:容器化应用易于监控、扩展和维护,大幅降低运维成本

💬 互动时间

🤔 问题1:你的项目中遇到过哪些环境部署的坑?Docker是如何帮你解决的?

🤔 问题2:在实际项目中,你还会在Dockerfile中添加哪些优化配置?

觉得这篇文章对你有帮助?请点赞、转发给更多C#同行!让我们一起拥抱容器化时代! 🎉


#C#开发 #Docker #NET8 #容器化 #DevOps

本文作者:技术老小子

本文链接:

版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!