Orchard Core 实战:使用 Docker 与 Docker Compose 构建、运行与部署

发布时间:2026/10/7 2:24:21
Orchard Core 实战:使用 Docker 与 Docker Compose 构建、运行与部署 CMS后端Web框架【免费下载链接】OrchardCoreOrchard Core is an open-source modular and multi-tenant application framework built with ASP.NET Core, and a content management system (CMS) built on top of that framework.项目地址https://gitcode.com/gh_mirrors/or/OrchardCore点击查看免费下载导读本文基于 Orchard Core 官方仓库中的 src/docs/topics/docker/README.md 编写系统讲解如何利用仓库自带的Dockerfile、.dockerignore与docker-compose.yml快速构建 Orchard Core 的 Docker 镜像与容器覆盖本地测试 PR、验证多数据库环境、清理构建中间镜像、多平台镜像构建与 BuildKit 高级用法。阅读完本文你将能够从命令行独立完成 Orchard Core 的容器化构建、运行、编排与生产化部署前的环境验证。为什么用 Docker 跑 Orchard CoreOrchard Core 是一个基于 ASP.NET Core 的开源模块化、多租户应用框架其源代码仓库根目录内置了Dockerfile允许开发者从源码直接构建属于自己的 Docker 镜像与容器。这对 Orchard Core 开发者尤其有用快速验证 PR将任意分支的源码打包成镜像在本地一键拉起测试环境不必手工安装 .NET SDK 与数据库跨环境验证镜像针对特定操作系统构建可以观察 Orchard Core 在不同基础镜像Linux / Windows下的运行表现生产部署铺垫虽然本文以本地测试为主要场景但同一套 Dockerfile 与镜像机制同样可迁移到生产服务器数据库全家桶测试配合 Docker Compose 可同时启动 SQL Server、MySQL、PostgreSQL 等 Orchard Core 官方支持的数据库服务。对于使用 NuGet 包解决方案的开发者也可以直接把源码中的Dockerfile与.dockerignore复制到解决方案根目录完成类似操作不过如果你的目录结构与源码仓库不一致可能需要自行调整 COPY 路径。准备工作在开始之前需要先在本机安装 Docker 环境Windows 用户推荐通过 WSLWindows Subsystem for Linux运行容器参考微软官方 WSL 容器教程docs.microsoft.com 上的 WSL Containers 教程Ubuntu / Linux 用户参考 Docker 官方 Engine 安装文档docs.docker.com/engine/install/ubuntu完成安装。安装完成后用docker --version确认命令行可用再进入 Orchard Core 源码根目录即Dockerfile所在目录执行后续命令。仓库根目录的 Docker 文件全景Orchard Core 仓库根目录下提供了 4 个与容器构建相关的文件它们协同完成“从源码到镜像”的流水线文件作用Dockerfile多阶段构建先用 .NET SDK 中间镜像发布站点再生成仅含 ASP.NET Core 运行时的最终镜像.dockerignore控制构建上下文排除App_Data、bin、obj等不必要文件Dockerfile-CI面向 GitHub Actions 持续集成的专用 Dockerfile直接从预编译产物构建Dockerfile-CI.dockerignoreCI 专用的 dockerignore只保留.build/release预编译目录其中Dockerfile与.dockerignore面向开发者本地使用Dockerfile-CI与Dockerfile-CI.dockerignore面向仓库的 CI 流水线见下文“CI 专用 Dockerfile”一节。深入理解 Dockerfile多阶段构建仓库当前实际使用的 Dockerfile打开仓库根目录的 Dockerfile当前实现如下# TARGETARCH and TARGETOS are set automatically when --platform is provided. FROM --platform$BUILDPLATFORM mcr.microsoft.com/dotnet/sdk:10.0 AS build-env ARG TARGETOS LABEL stagebuild-env WORKDIR /source # copy required files for building # .dockerignore excludes App_Data and binaries from these COPY ./src ./src COPY Directory.Build.props . COPY Directory.Packages.props . # build, results are placed in /app RUN dotnet publish src/OrchardCore.Cms.Web/OrchardCore.Cms.Web.csproj -c Release -o /app --framework net10.0 /p:RunAnalyzersfalse # build runtime image FROM mcr.microsoft.com/dotnet/aspnet:10.0-nanoserver-ltsc2025 AS build_windows FROM mcr.microsoft.com/dotnet/aspnet:10.0 AS build_linux FROM build_${TARGETOS} AS aspnet EXPOSE 80 ENV ASPNETCORE_URLShttp://:80 WORKDIR /app COPY --frombuild-env /app/ . ENTRYPOINT [dotnet, OrchardCore.Cms.Web.dll]该 Dockerfile 使用典型的**多阶段构建multi-stage build**策略构建阶段build-env基于mcr.microsoft.com/dotnet/sdk:10.0中间镜像其中包含完整的 .NET SDK。--platform$BUILDPLATFORM让构建阶段在发起构建的宿主机平台上执行配合 BuildKit 可避免跨平台模拟的开销。随后将src源码以及Directory.Build.props、Directory.Packages.props两个根级 MSBuild 属性文件复制进镜像执行dotnet publish生成 Release 发布产物到/app。运行时阶段基于mcr.microsoft.com/dotnet/aspnet:10.0仅含 ASP.NET Core 运行时不含 SDK生成最终镜像。ARG TARGETOS配合build_${TARGETOS}的多阶段目标选择可同时产出 Linux 与 Windowsnanoserver-ltsc2025两个平台的运行时镜像。运行时配置EXPOSE 80暴露 HTTP 端口ENV ASPNETCORE_URLShttp://:80让 Kestrel 监听 80 端口ENTRYPOINT直接以dotnet OrchardCore.Cms.Web.dll启动站点。版本说明仓库当前global.json指定的 .NET SDK 版本为10.0.401见 global.json因此 Dockerfile 使用net10.0目标框架。官方文档编写时示例为sdk:6.0与aspnet:3.1仅为当时快照以当前仓库实际内容为准若需回退到旧版本请自行同步修改基础镜像标签与--framework参数。文档示例中的经典写法官方文档展示了这一思想的简化版本方便理解结构# Create an intermediate image using .NET Core SDK FROM mcr.microsoft.com/dotnet/sdk:6.0 AS build-env LABEL stagebuild-env WORKDIR /app # Copy and build in the intermediate image COPY ./src /app RUN dotnet publish /app/OrchardCore.Cms.Web -c Release -o ./build/release # Build runtime image FROM mcr.microsoft.com/dotnet/core/aspnet:3.1 EXPOSE 80 ENV ASPNETCORE_URLS http://:80 WORKDIR /app COPY --frombuild-env /app/build/release . ENTRYPOINT [dotnet, OrchardCore.Cms.Web.dll]注意其中的LABEL stagebuild-env这个标签是后续“清理中间镜像”的关键钩子见下文。.dockerignore控制构建上下文仓库根目录的 .dockerignore 用于过滤发送给 Docker 守护进程的构建上下文防止把本地数据与编译产物带入镜像# Ignore any App_Data folder **/App_Data/ # Ignore all built assets **/[b|B]in/ **/[O|o]bj/逐行解读**/App_Data/排除所有租户数据目录。Orchard Core 默认把站点数据如 SQLite 数据库、日志存放在App_Data这些内容绝不能打进镜像**/[b|B]in/与**/[O|o]bj/同时匹配大写/小写形式的bin与obj目录剔除所有已编译的 .NET 构建产物保证镜像内是从干净源码重新发布的结果。官方文档还给出了一个更激进的“白名单”变体先忽略一切、再放行src适合只想打包源码的场景# ignore all ** # Except src for building !./src/* # Ignore any App_Data folder **/App_Data/ # Ignore all prebuild **/[b|B]in/ **/[O|o]bj/使用 docker 命令构建并运行镜像基础流程在源码根目录Dockerfile 所在目录执行REM Folder where the Dockerfile stands cd /orchardcore REM Build image from Dockerfile docker build -t oc . REM Creates a container, runs it and expose its service on port 80 docker run -p 80:80 ocdocker build -t oc .根据当前目录下的Dockerfile构建镜像并打上oc标签docker run -p 80:80 oc基于oc镜像创建并启动容器把容器内 80 端口映射到宿主机 80 端口。启动成功后浏览器访问 http://localhost 即可进入 Orchard Core 的安装向导。此时默认使用 SQLite 数据库——所有数据都写在容器内容器销毁后数据随之丢失适合快速验证若需要持久化与多数据库请使用下文的 Docker Compose。清理构建中间镜像由于Dockerfile使用中间镜像执行dotnet publish长时间不清理会占用可观磁盘空间。仓库为中间镜像打上了stagebuild-env标签便于精确清理。使用docker命令时的推荐流程REM Prunes intermediate containers created while building by using --rm docker build -t oc --rm . REM Prunes all intermediate images docker image prune -f --filter labelstagebuild-env REM Creates a container, runs it and expose its service on port 80 docker run -p 80:80 oc--rm构建完成后自动删除中间容器docker image prune -f --filter labelstagebuild-env仅删除带stagebuild-env标签的中间镜像保留最终运行镜像。使用 Docker Compose 编排多数据库环境Docker Compose 可以让你在源码根目录执行一条docker-compose up命令同时启动 Web 容器与 Orchard Core 官方支持的各数据库服务避免在宿主机上逐个安装数据库。前提是根目录存在docker-compose.yml文件。Compose 的完整用法参考 Docker 官方 Compose 文档docs.docker.com/compose。官方文档给出的docker-compose.yml示例version: 3.3 services: web: build: context: . dockerfile: Dockerfile ports: - 5009:80 depends_on: - sqlserver - mysql - postgresql sqlserver: image: mcr.microsoft.com/mssql/server environment: SA_PASSWORD: Pssw0rd!123456 ACCEPT_EULA: Y mysql: image: mysql:latest restart: always environment: MYSQL_DATABASE: orchardcore_database MYSQL_USER: orchardcore_user MYSQL_PASSWORD: orchardcore_password MYSQL_ROOT_PASSWORD: root_password ports: - 3306:3306 expose: - 3306 volumes: - mysql-data:/var/lib/mysql postgresql: image: postgres:latest volumes: - postgresql-data:/var/lib/postgresql/data ports: - 5432:5432 environment: POSTGRES_USER: orchardcore_user POSTGRES_PASSWORD: orchardcore_password POSTGRES_DB: orchardcore_database volumes: mysql-data: postgresql-data:关键点说明web 服务以当前目录为构建上下文context: .、使用根目录Dockerfile构建宿主机 5009 端口映射到容器 80 端口访问 http://localhost:5009 即可depends_on声明对三个数据库服务的启动依赖sqlserver 服务使用微软官方 SQL Server 镜像通过SA_PASSWORD与ACCEPT_EULA: Y完成初始化生产环境务必更换强密码并妥善管理SA_PASSWORDmysql 服务mysql:latest镜像通过环境变量预建orchardcore_database数据库与orchardcore_user用户数据持久化在命名卷mysql-datapostgresql 服务postgres:latest镜像同样通过环境变量初始化用户与数据库数据持久化在命名卷postgresql-data命名卷volumes段声明的mysql-data与postgresql-data用于跨容器生命周期持久化数据避免重启丢失。Compose 场景下的中间镜像清理REM Builds images if they are not already built docker-compose build REM Prune intermediate remaining images docker image prune -f --filter labelstagebuild-env REM Start all containers docker-compose updocker-compose build构建尚未构建的镜像docker image prune -f --filter labelstagebuild-env清理dotnet publish阶段留下的中间镜像docker-compose up启动全部容器。如果不定期清理中间镜像日积月累会占用大量磁盘空间stagebuild-env标签让清理变得精确而安全。自动创建租户Autosetup 与数据库 Shell 配置在容器场景下每次启动后都需要通过浏览器手动执行站点安装向导这对自动化测试与 CI 很不友好。官方文档将该主题标记为 TODO但给出了两条线索数据库 Shell 配置Orchard Core 的 Shell 配置可以存储在数据库中而不是默认的App_Data文件系统。在appsettings.json中配置{ OrchardCore: { Shells: { Database: { DatabaseProvider: SqlConnection, ConnectionString: , TablePrefix: , MigrateFromFiles: true } } } }然后在Startup.cs中通过services.AddOrchardCms().AddDatabaseShellsConfiguration();启用。MigrateFromFiles可在启用时把现有App_Data中的租户配置自动迁移到数据库。注意使用该提供程序前必须先创建好数据库并限制其访问权限。Autosetup 功能仓库在历史 PROrchardCMS/OrchardCore #4567中引入了自动安装能力可结合环境变量或配方Recipe在容器启动时自动完成站点初始化从而省去人工安装步骤。具体配置项以当前版本源码与发布说明为准。让容器通过 HTTPS 对外服务生产环境通常需要 HTTPS。ASP.NET Core 官方镜像仓库提供了现成的示例方案dotnet-docker 仓库中的 “Hosting ASP.NET Core Images with Docker over HTTPS” 样例核心思路是把开发证书dev certificate与密码导入容器并配置 Kestrel 绑定 HTTPS 端口。结合 Orchard Core 的 Dockerfile可在运行时通过挂载证书、设置ASPNETCORE_Kestrel__Certificates__Default__Path与Password环境变量实现具体以官方样例与 .NET 版本对应文档为准。针对特定环境构建镜像若要针对不同运行环境如不同操作系统发行版、不同 .NET 版本定制镜像关键在于基础镜像的选择.NET SDK 镜像mcr.microsoft.com/dotnet/sdk用于构建阶段包含编译所需的完整 SDK可按需指定版本号如10.0ASP.NET Core Runtime 镜像mcr.microsoft.com/dotnet/aspnet用于运行时阶段仅包含运行 ASP.NET Core 应用所需的运行时与依赖体积远小于 SDK 镜像并区分 Linux 与 Windowsnanoserver-ltsc2025变体。构建时通过--platform参数指定目标平台如--platformlinux/amd64、--platformwindows/amd64仓库 Dockerfile 中的ARG TARGETOS会自动接收该值并选择对应的运行时阶段。CI 专用 Dockerfile为什么仓库要维护两份仓库同时维护了 Dockerfile-CI 与 Dockerfile-CI.dockerignore其设计动机是GitHub Actions 是仓库的持续集成工具用于构建与测试各分支。若在 CI 上像本地一样执行完整的多阶段dotnet publish构建会显著慢于直接使用已发布产物因此Dockerfile-CI不再包含 SDK 构建阶段而是假定.build/release目录已存在预编译的发布产物直接用 ASP.NET Core 运行时镜像封装# This Docker file is intended for the CI # A prerequisite is a published application in the .build/release FROM --platform$BUILDPLATFORM golang:alpine AS build ARG TARGETOS FROM mcr.microsoft.com/dotnet/aspnet:10.0-nanoserver-ltsc2025 AS build_windows FROM mcr.microsoft.com/dotnet/aspnet:10.0 AS build_linux FROM build_${TARGETOS} AS aspnet EXPOSE 80 ENV ASPNETCORE_URLS http://:80 WORKDIR /app COPY .build/release /app ENTRYPOINT [dotnet, OrchardCore.Cms.Web.dll]而 Dockerfile-CI.dockerignore 采用白名单策略只放行预编译产物# Buildkit Only working in linux # Ignore all ** # Except precompiled files !/.build/release/*CI 中的实际用法在仓库的 GitHub Actions 工作流中如 .github/workflows/preview_ci.yml 与 .github/workflows/release_ci.yml先发布应用到.build/release再使用docker buildx build -f Dockerfile-CI --platformlinux/amd64 -t orchardproject/orchardcore-cms-linux:dev --push .同时构建并推送 Linux 与 Windows 两个平台的镜像。也就是说本地开发用Dockerfile含完整构建阶段直观、独立CI 发布用Dockerfile-CI纯运行时封装快速、稳定且通过 buildx 支持多平台--platform构建与推送。自定义 Dockerfile 与 BuildKit 注意事项如果希望在自己的项目中使用多个不同名称的 Dockerfile如针对不同环境维护多份需要满足Docker 版本至少 19.03才能启用 Docker BuildKitBuildKit 可解析多个不同的.dockerignore文件-f指定 Dockerfile 时使用-f Dockerfile.X同时自动匹配Dockerfile.X.dockerignore文档明确指出GitHub Actions 目前仅在 Linux 上支持 BuildKit相关讨论见仓库 issue #7651 与 docker/setup-buildx-action 的说明Windows/macOS runner 上的多平台构建能力受限跨平台构建尤其 Windows 镜像建议在 Linux runner 上通过 buildx 模拟完成。BuildKit 还带来额外的构建加速与缓存能力如并发执行构建步骤、按层缓存复用对频繁迭代 Dockerfile 的开发者有明显收益。常见问题速查问题解决方案容器启动后无法访问站点确认-p 80:80或-p 5009:80端口映射正确并检查ASPNETCORE_URLS是否绑定 80 端口磁盘被中间镜像占满docker image prune -f --filter labelstagebuild-env定期清理需要同时测多个数据库使用文档提供的docker-compose.yml一条docker-compose up拉起 SQL Server / MySQL / PostgreSQL容器数据随容器销毁丢失使用 Compose 命名卷mysql-data、postgresql-data持久化数据库数据想自动完成站点安装参考数据库 Shell 配置AddDatabaseShellsConfiguration与 Autosetup 功能避免手工向导需要 HTTPS参照 ASP.NET Core 官方 Docker HTTPS 样例注入开发证书并配置 Kestrel 证书路径需要 Windows 平台镜像使用带--platformwindows/amd64的 buildx 构建仓库 Dockerfile 已内置nanoserver-ltsc2025运行时阶段总结从源码到可运行的容器Orchard Core 仓库通过 Dockerfile 与 .dockerignore 提供了完整的多阶段构建方案SDK 中间镜像完成dotnet publish运行时镜像保持最小体积stagebuild-env标签让中间镜像可被精确清理。配合 docker-compose.yml 示例可以在本地一键验证 SQL Server、MySQL、PostgreSQL 三种官方支持的数据库环境Dockerfile-CI 则展示了面向 CI 的“预编译 运行时封装”模式支持通过 buildx 多平台发布。无论是日常测试 PR、验证多数据库兼容性还是为生产部署做铺垫这套容器化工作流都能直接复用。赞分享CMS后端Web框架【免费下载链接】OrchardCoreOrchard Core is an open-source modular and multi-tenant application framework built with ASP.NET Core, and a content management system (CMS) built on top of that framework.项目地址https://gitcode.com/gh_mirrors/or/OrchardCore点击查看免费下载相关推荐Sanic 应用 Docker 化部署实战镜像构建、容器运行与 docker-compose 编排Sanic 应用 Docker 化部署实战镜像构建、容器运行与 docker compose 编排 导读 本文基于 Sanic 官方部署文档完整讲解如何将一后端Web框架使用 Docker 容器化部署 Create T3 Appstandalone 镜像构建与 Docker Compose 完整实战使用 Docker 容器化部署 Create T3 Appstandalone 镜像构建与 Docker Compose 完整实战 本文是 Create T3开发工具CLI代码生成使用 Docker 部署自托管 Prisma 1.14 服务器docker-compose 配置与运维实战使用 Docker 部署自托管 Prisma 1.14 服务器docker compose 配置与运维实战 Prisma 的 自托管服务器Self host后端数据库GraphQL上一篇3分钟搞定Windows和Office激活零基础也能用的智能激活脚本下一篇Windows系统终极激活方案KMS_VL_ALL_AIO一键激活完整指南创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

关于本文作者

来自尧图内容编辑团队

尧图内容编辑团队 内容团队

尧图内容编辑团队

本文由尧图网络内容编辑团队执笔。团队由资深项目经理、前端工程师与设计师组成,所有内容均来自亲手交付的真实项目,先讲清问题、再给出可落地的解法。尧图深耕北京网站建设十年,服务过京华建材集团、智造科技等各行业客户,把一线经验沉淀为可复用的行业观察。

  • 十年建站经验,覆盖建材、制造、服务、文创等
  • 项目经理把关选题与事实准确性
  • 工程师与设计师联合撰写专业细节
  • 统一编辑规范,保证文风与排版一致
  • 每月复盘转化数据,迭代选题方向

延伸阅读

相关资讯与近期热门内容

深度阅读推荐

建站决策前值得细读的三篇

网站改版的5个关键决策
2024-08-12

网站改版的5个关键决策

什么时候该改版、改到什么程度、如何避免流量掉光,京华建材集团改版复盘给出答案。

获取专属建站方案

看完文章,把您的行业与预算告诉我们,免费获取一份量身定制的官网建设方案与报价。

立即免费咨询