在现代微服务和云原生架构中,用 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 是一个非常实用且现代化的流程。你从本地构建、测试、镜像推送到服务器运行以及运维监控都已掌握。