.NET WebAPI 使用 Docker 部署到 Linux:从开发到上线的完整实战指南

在现代微服务和云原生架构中,用 Docker 部署 .NET Web API 到 Linux 已是常见也极为实用的方式。本文将带你从零开始,一步步完成从开发环境到服务器上线的全过程。

前置准备

在开始之前,请确保你具备以下环境和工具:

  • 一个已创建并能正常运行的 .NET Web API 项目(例如基于 ASP.NET Core)

  • 本地安装好的 .NET SDK(建议与目标环境版本一致)

  • Docker 环境:本地用于构建镜像,目标 Linux 服务器也需要安装 Docker 引擎

  • (可选)一个容器镜像仓库(例如 Docker Hub、GitHub Container Registry 或私有仓库)

  • 一台 Linux 服务器(Ubuntu、CentOS、Debian 等皆可),具备 SSH 访问权限

为 Web API 项目添加 Docker 支持

1. 在项目根目录创建 Dockerfile

在你的 API 项目根目录(有 .csproj 的目录)新建一个 Dockerfile,示范内容如下(多阶段构建方式):

# 第一阶段:构建
FROM mcr.microsoft.com/dotnet/sdk:8.0 AS build
WORKDIR /src
COPY *.csproj ./
RUN dotnet restore

COPY . .
RUN dotnet publish -c Release -o /app/publish

# 第二阶段:运行镜像
FROM mcr.microsoft.com/dotnet/aspnet:8.0 AS runtime
WORKDIR /app
COPY --from=build /app/publish .
ENTRYPOINT ["dotnet", "YourApiProject.dll"]

说明:

  • 第一阶段使用 .NET SDK 镜像,完成 restore、build 和 publish
  • 第二阶段采用更轻量的运行时镜像,只包含运行所需组件
  • 将生成的发布文件从 build 阶段拷贝到运行镜像中
  • 创建项目时选择Docker支持,会自动创建Dockerfile文件

2. 调整项目配置以适应容器环境

  • 在 appsettings.json 或其他配置文件中,避免使用硬编码的 “localhost” 地址,改为可通过环境变量注入(例如 ASPNETCORE_URLS 或 ASPNETCORE_ENVIRONMENT)
  • 若 API 使用数据库链接,要确保连接字符串能在容器化或运行时注入(可以用环境变量或 secrets 管理)
  • 如果使用静态文件、CORS、HTTP → HTTPS 重定向等功能,确保容器内部配置允许这些行为

3. 更新 .dockerignore

为减少镜像体积与提升构建速度,在项目中创建 .dockerignore 文件,内容示例如下:

bin/
obj/
*.user
*.vs/
docker-compose*.yml

这样在构建镜像时会忽略不必要的文件。

本地镜像构建与测试

1. 在项目根目录执行镜像构建命令:

docker build -t my-dotnet-api:latest .

这个命令会根据 Dockerfile 构建一个名为 my-dotnet-api:latest 的镜像。

2. 启动容器进行功能验证:

docker run -d -p 5000:80 --name myapi-container my-dotnet-api:latest

这里将容器内的 80 端口映射到宿主机的 5000 端口。你可以在浏览器或 Postman 访问 http://localhost:5000(或你的 API 路径)进行测试。

3. 若 API 启动失败,可进入容器查看日志或 shell:

docker logs myapi-container
docker exec -it myapi-container bash

通过这些方式定位问题,如缺少配置、启动异常等。

将镜像推送到容器仓库

当本地镜像已经验证无误后,将它推送到你的镜像仓库,以便在服务器端拉取和运行。

1. 给镜像打 tag(如果你使用 Docker Hub 为例):

docker tag my-dotnet-api:latest yourdockerhubusername/my-dotnet-api:version1

2. 登录到仓库:

docker login

3. 推送镜像:

docker push yourdockerhubusername/my-dotnet-api:version1

此时你的镜像就在外部仓库可被拉取了。

在 Linux 服务器上部署与运行

1. 在 Linux 服务器安装 Docker

以 Ubuntu 为例,执行以下命令:

sudo apt-get update
sudo apt-get install -y ca-certificates curl
sudo mkdir -p /etc/apt/keyrings
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg
echo \
  "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] \
  https://download.docker.com/linux/ubuntu \
  $(. /etc/os-release && echo "$VERSION_CODENAME") stable" \
  | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
sudo apt-get update
sudo apt-get install -y docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin

安装完成后,确认 Docker 服务运行:

sudo systemctl enable docker
sudo systemctl start docker

2. 从仓库拉取镜像

docker pull yourdockerhubusername/my-dotnet-api:version1

3. 运行容器

docker run -d \
  --name webapi-prod \
  -e ASPNETCORE_ENVIRONMENT=Production \
  -p 80:80 \
  yourdockerhubusername/my-dotnet-api:version1

在这个命令中,我们:

  • 使用 -d 后台运行
  • 设置环境变量 ASPNETCORE_ENVIRONMENT=Production
  • 将外部服务器的 80 端口映射到容器的 80 端口

4. 配置反向代理(可选)

如果你的服务器上已有 Nginx 或 Apache,可配置代理,将请求转发到容器内部。例如,使用 Nginx:

server {
  listen 80;
  server_name api.yourdomain.com;

  location / {
    proxy_pass http://127.0.0.1:80;
    proxy_http_version 1.1;
    proxy_set_header Upgrade $http_upgrade;
    proxy_set_header Connection keep-alive;
    proxy_set_header Host $host;
    proxy_cache_bypass $http_upgrade;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header X-Forwarded-Proto $scheme;
  }
}

这样用户访问 api.yourdomain.com 时就会转发到你的 .NET API 容器中。

5. 设置开机启动与自动重启

为确保容器随服务器重启自动启动,可以在运行容器时加入重启策略:

docker run -d \
  --restart always \
  --name webapi-prod \
  -e ASPNETCORE_ENVIRONMENT=Production \
  -p 80:80 \
  yourdockerhubusername/my-dotnet-api:version1

或使用 systemd 服务脚本,管理容器启动与日志。

运维与监控建议

  • 使用 Docker 日志功能(docker logs)查看运行日志

  • 集成监控工具(如 Prometheus + Grafana、ELK Stack)来采集指标和日志

  • 定期清理旧镜像与容器,避免磁盘占用过高

  • 对外暴露 API 时注意安全(HTTPS、认证、访问控制等)

  • 若未来需要扩容与高可用,可考虑使用 Docker Compose、Swarm 或 Kubernetes

总结

将 .NET Web API 项目使用 Docker 部署到 Linux 是一个非常实用且现代化的流程。你从本地构建、测试、镜像推送到服务器运行以及运维监控都已掌握。

评论 添加
暂无评论,来聊两句?