ASP.NET Core Docker 部署完全指南

4 阅读1分钟

随着微服务和云原生应用的普及,Docker 容器化部署已经成为 ASP.NET Core 应用的标准实践。本文将详细介绍如何将 ASP.NET Core 应用部署到 Docker 容器中。 为什么选择 Docker 部署 ASP.NET Core? Docker 容器化为 ASP.NET Core 应用带来了三大核心优势: 环境一致性:确保开发、测试和生产环境的一致性,避免"在我机器上能跑"的问题 可移植性强:一次构建,到处运行,无需担心目标服务器的环境差异 资源利用率高:相比虚拟机,容器更加轻量级,启动更快,资源占用更少 准备工作 在开始之前,确保你的环境中已安装: .NET SDK (推荐 6.0 或更高版本) Docker Desktop 或 Docker Engine 一个 ASP.NET Core 项目 创建 Dockerfile 方式一:使用 Visual Studio 自动创建 在 Visual Studio 中创建新项目时,可以直接勾选"启用 Docker 支持"选项,IDE 会自动生成 Dockerfile。 或者在现有项目上右键点击 -> 添加 -> Docker 支持。 方式二:手写 Dockerfile 创建名为 Dockerfile 的文件(无扩展名),内容如下: dockerfile

编辑

使用 SDK 镜像进行构建

FROM mcr.microsoft.com/dotnet/aspnet:8.0 AS base WORKDIR /app EXPOSE 80 EXPOSE 443

使用 SDK 镜像进行发布

FROM mcr.microsoft.com/dotnet/sdk:8.0 AS build WORKDIR /src COPY ["YourApp/YourApp.csproj", "YourApp/"] RUN dotnet restore "YourApp/YourApp.csproj" COPY . . WORKDIR "/src/YourApp" RUN dotnet build "YourApp.csproj" -c Release -o /app/build

发布应用

FROM build AS publish RUN dotnet publish "YourApp.csproj" -c Release -o /app/publish

最终运行时镜像

FROM base AS final WORKDIR /app COPY --from=publish /app/publish . ENTRYPOINT ["dotnet", "YourApp.dll"] 这个 Dockerfile 使用了多阶段构建,能够有效减小最终镜像的大小。 创建 .dockerignore 文件 为了减小镜像大小,提高构建速度,创建 .dockerignore 文件: 文本

编辑

**/.dockerignore **/.env **/.git **/.gitignore **/.project **/.settings **/.toolstarget **/.vs **/.vscode **/.idea **/.proj.user **/.dbmdl **/.jfm **/azds.yaml **/bin **/charts */docker-compose */Dockerfile **/node_modules **/npm-debug.log **/obj **/secrets.dev.yaml **/values.dev.yaml LICENSE README.md 构建和运行 Docker 镜像 构建镜像 在项目根目录执行以下命令构建 Docker 镜像: bash

编辑

docker build -t your-app:latest . 运行容器 构建成功后,运行容器: bash

编辑

docker run -d -p 8080:80 --name my-app-container your-app:latest 现在可以通过 http://localhost:8080 访问你的应用。 生产环境配置 环境变量配置 在生产环境中,通常需要配置各种环境变量: bash

编辑

docker run -d
-p 8080:80
--name my-app-container
-e ASPNETCORE_ENVIRONMENT=Production
-e ConnectionStrings__DefaultConnection="Server=db;Database=MyApp;User=sa;Password=password;"
your-app:latest 挂载数据卷 对于需要持久化数据的场景,可以挂载数据卷: bash

编辑

docker run -d
-p 8080:80
--name my-app-container
-v /host/path:/app/data
your-app:latest 使用 Docker Compose 对于复杂的多服务应用,推荐使用 Docker Compose。创建 docker-compose.yml 文件: yaml

编辑

version: '3.8'

services: web: image: your-app:latest ports: - "8080:80" environment: - ASPNETCORE_ENVIRONMENT=Production - ConnectionStrings__DefaultConnection=Server=db;Database=MyApp;User=sa;Password=password; depends_on: - db networks: - app-network

db: image: mcr.microsoft.com/mssql/server:2022-latest environment: - ACCEPT_EULA=Y - SA_PASSWORD=yourStrong(!)Password volumes: - db-data:/var/opt/mssql networks: - app-network

volumes: db-data:

networks: app-network: driver: bridge 使用以下命令启动: bash

编辑

docker-compose up -d 优化技巧

  1. 使用 Alpine 镜像 为了进一步减小镜像大小,可以使用 Alpine Linux 基础镜像: dockerfile

编辑

FROM mcr.microsoft.com/dotnet/aspnet:8.0-alpine AS base WORKDIR /app EXPOSE 80 EXPOSE 443 2. 启用分层缓存 利用 Docker 的分层缓存机制,在恢复 NuGet 包后复制项目文件: dockerfile

编辑

COPY ["YourApp/YourApp.csproj", "YourApp/"] RUN dotnet restore "YourApp/YourApp.csproj" COPY . . 3. 非 root 用户运行 出于安全考虑,在生产环境中应避免以 root 用户运行应用: dockerfile

编辑

FROM mcr.microsoft.com/dotnet/aspnet:8.0 AS base WORKDIR /app EXPOSE 80 EXPOSE 443

RUN addgroup -g 1001 -S nonroot &&
adduser -u 1001 -S nonroot -G nonroot USER 1001 监控和日志 日志配置 在 appsettings.json 中配置日志: json

编辑

{ "Logging": { "LogLevel": { "Default": "Information", "Microsoft.AspNetCore": "Warning" } } } 查看容器日志 bash

编辑

docker logs my-app-container docker logs -f my-app-container # 实时查看日志 CI/CD 集成 GitHub Actions 示例 创建 .github/workflows/docker-publish.yml: yaml

编辑

name: Publish Docker Image

on: push: branches: [ main ]

jobs: push_to_registry: name: Push Docker image to Docker Hub runs-on: ubuntu-latest steps: - name: Check out the repo uses: actions/checkout@v3

  - name: Log in to Docker Hub
    uses: docker/login-action@v2
    with:
      username: ${{ secrets.DOCKER_USERNAME }}
      password: ${{ secrets.DOCKER_PASSWORD }}
  
  - name: Extract metadata
    id: meta
    uses: docker/metadata-action@v4
    with:
      images: your-dockerhub-username/your-app
  
  - name: Build and push Docker image
    uses: docker/build-push-action@v4
    with:
      context: .
      push: true
      tags: ${{ steps.meta.outputs.tags }}
      labels: ${{ steps.meta.outputs.labels }}

常见问题及解决方案

  1. 端口冲突 确保容器端口映射正确,避免端口冲突。
  2. 权限问题 在 Linux 系统上,确保 Docker 服务有足够的权限访问相关文件。
  3. 内存限制 在 Docker 运行时设置适当的内存限制: bash

编辑

docker run -d --memory=512m your-app:latest 总结 通过 Docker 部署 ASP.NET Core 应用能够显著简化部署流程,提高应用的可移植性和可扩展性。掌握多阶段构建、环境变量配置、Docker Compose 等关键技术,能够让你的应用更好地适应现代云原生环境的需求。 随着容器技术的不断发展,ASP.NET Core + Docker 的组合将成为构建现代化应用的标准实践。