docker - 6 docker 部署 net core

1 最简单部署容器化 .net core

发布

image

# 请参阅 https://aka.ms/customizecontainer 以了解如何自定义调试容器,以及 Visual Studio 如何使用此 Dockerfile 生成映像以更快地进行调试。

  

# 此阶段用于在快速模式(默认为调试配置)下从 VS 运行时

FROM mcr.microsoft.com/dotnet/aspnet:6.0 AS base

WORKDIR /app

# 只是说明文档,不实际映射端口

EXPOSE 80  

  
  

# 此阶段用于生成服务项目

FROM mcr.microsoft.com/dotnet/sdk:6.0 AS build

ARG BUILD_CONFIGURATION=Release

WORKDIR /src

COPY ["APP01.csproj", "."]

RUN dotnet restore "./APP01.csproj"

COPY . .

WORKDIR "/src/."

RUN dotnet build "./APP01.csproj" -c $BUILD_CONFIGURATION -o /app/build

  

# 此阶段用于发布要复制到最终阶段的服务项目

FROM build AS publish

ARG BUILD_CONFIGURATION=Release

RUN dotnet publish "./APP01.csproj" -c $BUILD_CONFIGURATION -o /app/publish /p:UseAppHost=false

  

# 此阶段在生产中使用,或在常规模式下从 VS 运行时使用(在不使用调试配置时为默认值)

FROM base AS final

WORKDIR /app

COPY --from=publish /app/publish .

ENTRYPOINT ["dotnet", "APP01.dll"]

终端打开
image

docker build -t app01:v251114.01 .

image

容器里publish阶段后的文件

image

关于/src目录:

  1. 只存在于构建阶段 :

    • /src 目录仅在 build 阶段存在,用于存放源代码和编译过程
    • 当构建进入到 final 阶段时, /src 目录及其内容不会被包含在最终的容器镜像中
    • 这是多阶段构建的关键优势之一:只保留运行时需要的文件,减小镜像体积
  2. 构建过程中的作用 :

    • 在 build 阶段,源代码被复制到 /src 目录
    • 依赖被恢复(dotnet restore)
    • 代码被编译(dotnet build)到 /app/build 目录
    • 然后在 publish 阶段,编译后的代码被发布到 /app/publish 目录

最终生成的内容:

最终的容器镜像( final 阶段)只包含:

  1. ASP.NET Core运行时环境 :基于 mcr.microsoft.com/dotnet/aspnet:6.0 镜像
  2. 应用程序发布文件 :通过 COPY --from=publish /app/publish . 命令从 publish 阶段复制到容器的 /app 目录
  3. 入口点设置 :通过 ENTRYPOINT ["dotnet", "APP01.dll"] 设置启动命令

本地运行

image
image

测试接口

http://localhost:5050/WeatherForecast

image

推送到阿里云镜像

# 格式:docker tag 本地镜像ID 公网仓库地址:标签 
docker tag 6b37117bde9c crpi-eiz9nv00dsmzs5be.cn-chengdu.personal.cr.aliyuncs.com/jonckers/repository:v251114.01

docker push crpi-eiz9nv00dsmzs5be.cn-chengdu.personal.cr.aliyuncs.com/jonckers/repository:v251114.01

image

2 使用 docker compose

image

Dockerfile

# 请参阅 https://aka.ms/customizecontainer 以了解如何自定义调试容器,以及 Visual Studio 如何使用此 Dockerfile 生成映像以更快地进行调试。

# 此阶段用于在快速模式(默认为调试配置)下从 VS 运行时
FROM mcr.microsoft.com/dotnet/aspnet:6.0 AS base
WORKDIR /app
EXPOSE 80


# 此阶段用于生成服务项目
FROM mcr.microsoft.com/dotnet/sdk:6.0 AS build
ARG BUILD_CONFIGURATION=Release
WORKDIR /src
COPY ["APP01/APP01.csproj", "APP01/"]
COPY ["APP01.CORE/APP01.CORE.csproj", "APP01.CORE/"]
RUN dotnet restore "./APP01/APP01.csproj"
COPY . .
WORKDIR "/src/APP01"
RUN dotnet build "./APP01.csproj" -c $BUILD_CONFIGURATION -o /app/build

# 此阶段用于发布要复制到最终阶段的服务项目
FROM build AS publish
ARG BUILD_CONFIGURATION=Release
RUN dotnet publish "./APP01.csproj" -c $BUILD_CONFIGURATION -o /app/publish /p:UseAppHost=false

# 此阶段在生产中使用,或在常规模式下从 VS 运行时使用(在不使用调试配置时为默认值)
FROM base AS final
WORKDIR /app
COPY --from=publish /app/publish .
ENTRYPOINT ["dotnet", "APP01.dll"]

如果拷贝到 linux 执行,不要拷贝 docker-compose.override.yml,我就被80端口覆盖了

# 定义服务列表
services:
  # 服务名称:app01
  app01:
    # 镜像名称,构建后将使用这个名称和标签
    image: app01:v251116.01
    
    # 构建配置
    build:
      # 构建上下文路径,. 表示在docker-compose.yml所在目录
      context: .
      # Dockerfile的路径,相对于上下文目录
      dockerfile: APP01/Dockerfile
    
    # 容器名称,自定义为app01_webapi
    container_name: app01_webapi
    
    # 端口映射:主机端口8011映射到容器端口80
    ports:
      - "8011:80"
    
    # 卷挂载:将主机上的配置文件挂载到容器内
    volumes:
      - ./config+webapi/appsettings.json:/app/appsettings.json
    
    # 环境变量设置
    environment:
      - ASPNETCORE_ENVIRONMENT=Development
    
    # 重启策略:始终重启容器(即使在Docker守护进程重启后)
    restart: always
  1. services部分 :

    • 定义了项目中的所有服务,这里只有一个名为 app01 的服务。
  2. 镜像与构建配置 :

    • image: app01:v251115.03 :指定构建后的镜像名称,v251115.03看起来是版本标记。
    • build.context: . :设置构建上下文为当前目录,意味着Docker会将整个当前目录作为构建上下文发送给Docker守护进程。
    • build.dockerfile: APP01/Dockerfile :指定Dockerfile的路径,位于APP01子目录下。
  3. 容器配置 :

    • container_name: app01_webapi :为容器指定一个固定名称,便于管理和引用。
    • ports: - "8011:80" :将主机的8011端口映射到容器的80端口,这样可以通过 http://localhost:8011 访问应用。
  4. 数据持久化与配置 :

    • volumes: - ./config+webapi/appsettings.json:/app/appsettings.json :
      • 将主机上 config+webapi 目录中的 appsettings.json 文件挂载到容器内的 /app/appsettings.json 路径。
      • 这允许在不重建镜像的情况下更新配置文件。
  5. 环境设置 :

    • environment: - ASPNETCORE_ENVIRONMENT=Development :
      • 设置ASP.NET Core应用的运行环境为Development(开发环境)。
      • 这会影响应用加载的配置文件(优先使用appsettings.Development.json)和运行时行为。
  6. 自动恢复 :

    • restart: always :设置容器的重启策略为始终重启。
    • 这意味着如果容器因任何原因停止(包括Docker守护进程重启),Docker将自动重新启动它。

工作流程:

当执行 docker-compose up 命令时:

  1. Docker Compose会在当前目录( . )构建镜像,使用APP01/Dockerfile作为构建定义
  2. 构建完成后,镜像将被标记为 app01.v251115.03
  3. 基于该镜像创建一个名为 app01_webapi 的容器
  4. 容器启动时会挂载指定的配置文件、设置环境变量并映射端口
  5. 容器将运行ASP.NET Core应用,并在容器停止时根据重启策略自动恢复
    这个配置文件实现了一个完整的ASP.NET Core应用容器化部署,包含了构建、配置、网络和持久化等关键方面。

命令

 docker-compose up -d

image

posted @ 2025-11-16 13:26  【唐】三三  阅读(3)  评论(0)    收藏  举报