使用 Docker 构建 .NET 8应用,你一招Docker容器化,让你的.NET 8应用一次构建,到处运行,彻底告别"在我机器上能跑"的尴尬!
作为C#开发者,你一定遇到过这些问题:
✅ 环境一致性:开发、测试、生产完全相同的运行环境
✅ 快速部署:打包一次,任何地方都能运行
✅ 资源隔离:不同应用互不干扰
✅ 版本管理:镜像版本化,回滚轻松搞定
打开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("🎉 业务逻辑处理完成!");
}
}
}
我们正常编译运行如下
在项目根目录创建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"]
多阶段构建的优势:
缓存优化技巧:
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
期望输出:
Markdown🚀 .NET 8 Docker应用启动成功! ⏰ 启动时间: 2025-08-05 22:44:55 🖥️ 运行环境: Unix 5.15.167.4 📁 工作目录: /app 🔄 开始处理业务逻辑... 📊 处理任务 1/3 📊 处理任务 2/3 📊 处理任务 3/3 🎉 业务逻辑处理完成! ✅ 应用执行完成!
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是如何帮你解决的?
🤔 问题2:在实际项目中,你还会在Dockerfile中添加哪些优化配置?
觉得这篇文章对你有帮助?请点赞、转发给更多C#同行!让我们一起拥抱容器化时代! 🎉
#C#开发 #Docker #NET8 #容器化 #DevOps
本文作者:技术老小子
本文链接:
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!