环境准备与项目部署

安装必要工具

  • 确保本地已安装.NET SDKDocker,推荐使用Visual Studio 2022或JetBrains Rider作为开发工具。

创建.NET Web API项目

通过命令行生成项目

dotnet new webapi -n mywebapi
cd mywebapi

编写Dockerfile

多阶段构建优化

在项目根目录无后缀的Dockerfile文件

# 构建阶段
FROM mcr.microsoft.com/dotnet/sdk:7.0 AS build
WORKDIR /src
COPY . .
RUN dotnet restore
RUN dotnet publish -c Release -o /app

# 运行阶段
FROM mcr.microsoft.com/dotnet/aspnet:7.0 AS final
WORKDIR /app
COPY --from=build /app .
EXPOSE 80
ENTRYPOINT ["dotnet", "mywebapi.dll"]
  • 多阶段构建可以减少最终镜像体积。

  • WORKDIR指定容器内工作目录

配置.dockerignore

创建.dockerignore文件排除非必要文件(bin/、obj/)

构建与运行容器

构建Docker镜像

docker build -t mywebapi:1.0 .
  • -t指定镜像名称及标签

  • 末尾的.表示Dockerfile所在目录

启动容器

docker run -d -p 8080:80 --restart=always --name webapi_container mywebapi:1.0
  • -p 8080:80将容器80端口映射到宿主机8080

  • --restart-always容器崩溃后自动重启

部署优化

依赖缓存加速构建

通过分离COPY *.csprojCOPY . .操作,利用Docker层缓存机制

COPY *.csproj ./
RUN dotnet restore
COPY . ./
  • 当代码变更但依赖未变时,可跳过dotnet restore步骤

检查配置

Program.cs中添加

app.MapHealthChecks("/health");
  • 容器启动后可通过http://localhost:8080/health验证服务状态

日志管理

挂载日志目录避免容器销毁后数据丢失

docker run -v /host/logs:/app/logs ...

生产环境

使用Docker Compose编排

创建docker-compose.yml实现一键部署

version: '3'
services:
  webapi:
    build: .
    ports:
      - "8080:80"
    restart: unless-stopped
  • 通过docker compose up -d启动服务集群

镜像安全

  • 使用alpine版本镜像(如aspnet:9.0-alpine)

  • 扫描镜像漏洞docker scan mywebapi:1.0

问题排查

问题现象

解决方案

容器启动后立即退出

检查ENTRYPOINT路径是否正确

端口访问被拒绝

确认EXPOSE与映射端口一致

依赖项缺失

验证是否执行dotnet restore

镜像体积过大

使用多阶段构建并清理中间层