当前位置: 首页 > news >正文

从零到一:在Ubuntu Server上部署你的第一个.NET 8 Web API(含Dockerfile编写与容器化实战)

从零到一:在Ubuntu Server上部署你的第一个.NET 8 Web API(含Dockerfile编写与容器化实战)

最近两年,.NET跨平台开发能力突飞猛进,特别是.NET 8的发布让Linux服务器部署变得前所未有的简单。作为一名长期在Linux环境部署.NET应用的全栈开发者,我想分享一个完整的实战流程——从裸机Ubuntu Server开始,到最终运行在Docker容器中的Web API服务。这个过程不仅涉及基础环境配置,更重要的是教会你如何将开发成果转化为可部署的生产级应用。

1. 环境准备:Ubuntu Server与.NET 8 SDK

在开始之前,确保你有一台运行Ubuntu Server 22.04 LTS的机器(物理机或云实例均可)。这个版本之所以被推荐,是因为它提供了最完整的.NET支持且生命周期长达5年。

1.1 安装基础依赖

首先更新系统包索引并安装必要的工具链:

sudo apt update && sudo apt upgrade -y sudo apt install -y curl wget git unzip

1.2 安装.NET 8 SDK

对于Ubuntu 22.04,微软提供了官方的APT源配置方式:

sudo apt install -y dotnet-sdk-8.0

安装完成后验证版本:

dotnet --version # 预期输出:8.0.x

注意:如果系统提示找不到包,可能需要先添加微软的GPG密钥和软件源:

wget https://packages.microsoft.com/config/ubuntu/22.04/packages-microsoft-prod.deb -O packages-microsoft-prod.deb sudo dpkg -i packages-microsoft-prod.deb rm packages-microsoft-prod.deb

2. 创建你的第一个Web API项目

2.1 初始化项目结构

使用.NET CLI创建一个最小化的Web API项目:

dotnet new webapi -n WeatherAPI --no-https -o ~/WeatherAPI cd ~/WeatherAPI

这个命令创建了一个:

  • 不启用HTTPS的Web API项目(简化开发环境配置)
  • 名为WeatherAPI的天气服务示例
  • 项目目录位于用户主文件夹下

2.2 关键代码解析

打开Program.cs,你会看到一个精简的现代.NET API模板:

var builder = WebApplication.CreateBuilder(args); builder.Services.AddControllers(); var app = builder.Build(); app.MapControllers(); app.Run();

相比传统Startup类,这种"最小API"模式更符合现代开发习惯。让我们添加一个简单的天气控制器:

touch Controllers/WeatherForecastController.cs

编辑该文件并加入:

using Microsoft.AspNetCore.Mvc; namespace WeatherAPI.Controllers; [ApiController] [Route("[controller]")] public class WeatherForecastController : ControllerBase { private static readonly string[] Summaries = new[] { "Freezing", "Bracing", "Chilly", "Cool", "Mild", "Warm", "Balmy", "Hot", "Sweltering", "Scorching" }; [HttpGet(Name = "GetWeatherForecast")] public IEnumerable<WeatherForecast> Get() { return Enumerable.Range(1, 5).Select(index => new WeatherForecast { Date = DateOnly.FromDateTime(DateTime.Now.AddDays(index)), TemperatureC = Random.Shared.Next(-20, 55), Summary = Summaries[Random.Shared.Next(Summaries.Length)] }) .ToArray(); } }

2.3 本地运行测试

启动开发服务器:

dotnet run

用curl测试API端点:

curl http://localhost:5000/WeatherForecast | jq

你应该能看到返回的JSON格式天气数据。按Ctrl+C停止服务。

3. 容器化部署:Docker实战

3.1 安装Docker引擎

在Ubuntu上安装Docker CE:

sudo apt install -y docker.io sudo systemctl enable --now docker sudo usermod -aG docker $USER newgrp docker # 刷新用户组

3.2 编写生产级Dockerfile

在项目根目录创建Dockerfile

# 构建阶段 FROM mcr.microsoft.com/dotnet/sdk:8.0 AS build WORKDIR /src COPY . . RUN dotnet restore RUN dotnet publish -c Release -o /app # 运行时阶段 FROM mcr.microsoft.com/dotnet/aspnet:8.0 AS runtime WORKDIR /app COPY --from=build /app . EXPOSE 80 ENTRYPOINT ["dotnet", "WeatherAPI.dll"]

这个多阶段构建的Dockerfile具有以下优化:

  1. 分离构建环境和运行时环境,减小最终镜像体积
  2. 使用官方微软镜像,确保兼容性
  3. 明确暴露80端口(HTTP标准端口)

3.3 构建并运行容器

执行构建命令:

docker build -t weatherapi .

运行容器实例:

docker run -d -p 8080:80 --name weather weatherapi

验证服务:

curl http://localhost:8080/WeatherForecast | jq

4. 生产环境优化建议

4.1 性能调优参数

docker run命令中添加.NET运行时优化参数:

docker run -d -p 8080:80 \ -e DOTNET_SYSTEM_GLOBALIZATION_INVARIANT=1 \ -e ASPNETCORE_ENVIRONMENT=Production \ --name weather weatherapi

关键环境变量说明:

变量名推荐值作用
DOTNET_SYSTEM_GLOBALIZATION_INVARIANT1禁用全球化特性,提升性能
ASPNETCORE_ENVIRONMENTProduction启用生产模式配置
COMPlus_ReadyToRun1启用AOT编译优化

4.2 日志与监控配置

修改Program.cs添加结构化日志:

builder.Logging.ClearProviders(); builder.Logging.AddJsonConsole(options => { options.IncludeScopes = true; options.TimestampFormat = "HH:mm:ss"; options.JsonWriterOptions = new() { Indented = true }; });

4.3 健康检查端点

添加健康检查路由:

app.MapGet("/health", () => Results.Ok(new { status = "healthy" }));

然后在Dockerfile中添加健康检查指令:

HEALTHCHECK --interval=30s --timeout=3s \ CMD curl -f http://localhost/health || exit 1

5. CI/CD集成示例

5.1 GitHub Actions自动化流程

创建.github/workflows/docker-build.yml

name: Docker Build on: push: branches: [ "main" ] jobs: build: runs-on: ubuntu-latest steps: - uses: actions/checkout@v3 - name: Login to Docker Hub uses: docker/login-action@v2 with: username: ${{ secrets.DOCKER_HUB_USERNAME }} password: ${{ secrets.DOCKER_HUB_TOKEN }} - name: Build and push uses: docker/build-push-action@v4 with: push: true tags: yourusername/weatherapi:latest

5.2 多架构镜像构建

修改Dockerfile支持ARM64:

# syntax=docker/dockerfile:1.4 FROM --platform=$BUILDPLATFORM mcr.microsoft.com/dotnet/sdk:8.0 AS build # ...其余内容保持不变...

构建命令更新为:

docker buildx build --platform linux/amd64,linux/arm64 -t yourusername/weatherapi:multiarch --push .

在实际部署中发现,这种多阶段构建配合ARM64支持的配置,能让同一套代码无缝运行在树莓派到云服务器的各种环境。特别是在Kubernetes集群中部署时,节点架构差异完全由Docker自动处理,大大简化了运维复杂度。

http://www.jsqmd.com/news/755192/

相关文章:

  • 高效注意力机制在4K视频生成中的优化实践
  • NXP S32K-144开发环境搭建与Keil MDK 5调试实战
  • STM32新手避坑指南:用HAL库驱动AT24C02 EEPROM,从接线到读写一气呵成
  • 3步彻底解决PCL2启动器Java环境配置问题:从Forge安装失败到流畅运行
  • 别再只盯着Gmapping了!手把手教你用Cartographer在ROS Noetic上搭建激光SLAM(含IMU/里程计融合配置)
  • 嵌入式开发避坑指南:eMMC写保护配置不当,你的设备可能“变砖”
  • 基于TypeScript的MCP服务器模板:从零构建AI助手扩展能力
  • MyBatis XML里写大于小于号总报错?试试这两种写法,别再硬编码了
  • 基于GPT与Stable Diffusion的QQ机器人:AI对话与绘画集成实践
  • 50kW 光储一体机 功率回路硬件设计报告(五)结束啦!!!
  • 液压执行器力控制的强化学习安全框架设计
  • ASP.NET Core集成OIDC客户端:现代身份认证的瑞士军刀实践
  • K8S运维实战:当Alpine容器里没有curl/telnet时,我是这样在线下准备离线安装包的
  • AI智能体上下文引擎:解决长对话记忆与成本效率的核心方案
  • 腾讯云 CVM 不同代际实例性能差异有多大怎么选?
  • C++27并行计算提速秘钥:自动向量化+任务窃取+拓扑感知调度(仅限Clang 18+/GCC 14+可用)
  • ARM CoreLink LPD-500低功耗分配器技术解析与应用
  • 2026年4月靠谱的钢结构厂商推荐,有名的钢结构,环保节能型的钢结构建筑选择 - 品牌推荐师
  • AI智能体技能树可视化:自动化解析与依赖关系分析工具
  • 别光看理论了!用PyTorch+bert-base-chinese实战新闻分类,附完整代码和数据集
  • 别再混淆了!用Python代码实战演示BF16、FP16、FP32的相互转换(附避坑指南)
  • DeepSeek-R1大模型微调实战:从LoRA原理到项目部署全解析
  • 开源大模型风险治理实战:OpenDerisk框架解析与应用指南
  • 别再手动翻DICOM文件了!用Python+pydicom一键提取患者、影像关键信息(附完整代码)
  • 汇编是最贴近CPU心跳的编程语言
  • 从《地牢大师》到算法实战:用C++ BFS解决三维迷宫问题(附OpenJudge题解)
  • 从零构建知识图谱驱动的数字艺术平台:技术架构与工程实践
  • 手把手教你用Stellar Data Recovery Toolkit 11.0从崩溃的Windows 11系统里救回重要文件(附可启动U盘制作教程)
  • Agent Skills:为AI编码助手注入软件工程最佳实践的框架指南
  • 别再折腾了!Windows 10/11下PyTorch3D 0.7.4 + CUDA 11.6 保姆级安装避坑指南