新人 使用docker部署Asp.net Core WebApi项目 .Net 8

6 阅读3分钟

.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 端口一致。
  • 自动重启健康检查(可选):
    --restart unless-stopped
    
    Dockerfile 里加:
    HEALTHCHECK --interval=30s --timeout=3s --start-period=5s --retries=3 \
      CMD curl -f http://localhost:7777/health || exit 1
    
    并在 Program.cs 里:
    app.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 → 容器化完成!