.NET 8 WebApi 容器化部署流程
1. 创建项目并启用 Docker 支持(可后续添加)
# VS 新建项目时勾选 "启用 Docker" 或后续右键 → 添加 → Docker 支持
⚠️ 补充:
- Dockerfile 必须与
.csproj同级,否则dotnet restore会找不到项目。 - 后续添加支持时,右键项目 → 添加 → Docker 支持 会自动生成正确位置的 Dockerfile。
2. 右键项目 → 发布 → 文件夹发布(默认配置)
# VS 发布向导选择 "文件夹" → 下一步 → 完成
⚠️ 补充:
- 务必选 Release + x64(默认通常是 AnyCPU,也可),避免 Debug 体积大、带 pdb。
- 发布前 清理再发布,防止旧 dll 残留。
3. 在发布目录创建 Dockerfile(VS 自带导航)
# 发布完成后 → 打开文件夹 → 新建 Dockerfile
⚠️ 补充:
- Windows 下新建文件 行尾符改为 LF(VS Code 右下角点 CRLF → LF),否则容器内
#!/bin/sh^M: not found。 - 文件名严格 Dockerfile(无扩展名)。
4. 编写简洁版 Dockerfile
# 使用最小运行时镜像
FROM mcr.microsoft.com/dotnet/aspnet:8.0 AS base
WORKDIR /app
# 复制所有发布输出
COPY . .
ENTRYPOINT ["dotnet", "Video.Api.dll"]
⚠️ 补充:
- 若后续想 非 root 运行,末尾加一行:
USER $APP_UID - EXPOSE 端口 建议显式写出(与代码
Listen端口一致):EXPOSE 8080
5. 通过 SSH 上传发布文件 & Dockerfile 到 Linux
# 建议目录结构
# /home/ubuntu/video-api/
# ├── publish/
# │ ├── Video.Api.dll
# │ └── ...
# └── Dockerfile
⚠️ 补充:
- 上传后 统一权限:
chmod -R 755 /home/ubuntu/video-api - 用
rsync增量上传更快:rsync -avz ./publish/ user@ip:/home/ubuntu/video-api/publish/
6. 构建镜像
docker build -t video-api:1.0.0 .
# 注意末尾英文点“.” 表示当前上下文
⚠️ 补充:
- 上下文路径就是最后一个
.,不要把 Dockerfile 放到 publish 里再 build,否则COPY . .会多一层目录。 - 第一次构建可加
--no-cache确保干净:docker build -t video-api:1.0.0 . --no-cache
7. 启动容器
docker run -d \
--name video-api \
-p 9999:7777 \
-e ASPNETCORE_ENVIRONMENT=Development \
-e ASPNETCORE_HTTP_PORTS=7777 \
video-api:1.0.0
⚠️ 补充:
- 必带环境变量(否则默认监听
https://localhost:5001):-e ASPNETCORE_URLS=http://+:7777 - 端口映射前面是宿主机对外端口,后面必须与代码
Listen端口一致。 - 加 自动重启 与 健康检查(可选):
Dockerfile 里加:--restart unless-stopped
并在 Program.cs 里:HEALTHCHECK --interval=30s --timeout=3s --start-period=5s --retries=3 \ CMD curl -f http://localhost:7777/health || exit 1app.MapHealthChecks("/health");
8. 常见错误速查(Markdown 表格)
| 现象 | 90% 根因 | 一行排查/修复 |
|---|---|---|
| 容器秒退 | 监听端口 ≠ 实际端口 | docker logs video-api |
| 浏览器 404 | 默认监听 HTTPS | 加 -e ASPNETCORE_URLS=http://+:7777 |
| 端口占用 | 宿主机 9999 被占用 | lsof -i:9999 换端口 |
| 文件找不到 | ENTRYPOINT 大小写错 | docker exec video-api ls -l |
| 权限拒绝 | 上传后无执行权 | chmod -R 755 ./publish |
| Dockerfile CRLF | 容器内 ^M 报错 | dos2unix Dockerfile |
| 构建上下文错 | 忘记末尾 . | docker build -t video:1.0.0 . |
✅ 一键验证部署成功
curl http://localhost:9999/weatherforecast
返回 JSON → 容器化完成!