
Dokku Docker Local Scheduler 深度指南默认调度器原理、并行部署与资源限制配置【免费下载链接】dokkuA docker-powered PaaS that helps you build and manage the lifecycle of applications项目地址: https://gitcode.com/GitHub_Trending/do/dokku本文以 Dokku 的scheduler-docker-local插件为核心系统讲解 Dokku 在单机 Docker 环境下管理应用生命周期的默认调度器从调度器切换、amd64/arm64 跨架构部署、init 进程注入、进程级并行调度到scheduler-docker-local:report报告命令与资源限制属性的完整用法。读完本文你将能够熟练配置单机调度行为、诊断部署并行度瓶颈并在需要时通过app.json精细控制每个进程类型的启动并发度。调度器概览Dokku 的默认单机调度器scheduler-docker-local是 Dokku 内置的调度器插件位于 plugins/scheduler-docker-local负责在单台服务器上使用 Docker 直接管理应用容器的完整生命周期。与所有调度器一样它以应用为单位进行设置——Dokku 通过scheduler:set命令为每个应用指定使用哪个调度器。该插件是 Dokku 的默认调度器。若要显式将某个应用切回 docker-local例如应用此前被配置为其他调度器如scheduler-k3s可执行dokku scheduler:set node-js-app selected docker-local由于 docker-local 本就是默认值将selected属性置空同样是恢复默认调度器的合法方式dokku scheduler:set node-js-app selected也就是说dokku scheduler:set app selected不带值即可把应用调度器重置回 docker-local。该插件包含两个核心子命令自 0.12.12 起新增scheduler-docker-local:report [app] [flag] # Displays a scheduler-docker-local report for one or more apps scheduler-docker-local:set [app|--global] key (value) # Set or clear a scheduler-docker-local property for an app or globally从源码看set子命令对属性键做了白名单校验只接受init-process与parallel-schedule-count两个键传入其他键会直接报错当带值写入时通过fn-plugin-property-write落盘无值空值时则执行fn-plugin-property-delete完成清除见 plugins/scheduler-docker-local/subcommands/set。在 arm64 主机上部署 amd64 镜像自 0.33.0 起支持。目前许多 buildpack 类构建器只产出 amd64 架构的镜像。scheduler-docker-local会在每次部署时自动检测镜像架构如果镜像架构为amd64而当前主机不是 amd64即 arm64 部署目标则自动为容器追加--platformlinux/amd64参数使其能够借助 Docker 的模拟层在 arm64 主机上运行。对应实现在容器启动逻辑 plugins/scheduler-docker-local/bin/scheduler-deploy-process-container 中local DOKKU_IMAGE_ARCHITECTURE$($DOCKER_BIN image inspect --format {{.Architecture}} $IMAGE) if [[ $DOKKU_IMAGE_ARCHITECTURE amd64 ]] [[ $(dpkg --print-architecture 2/dev/null || true) ! amd64 ]]; then dokku_log_warn Detected linux/amd64 image, forcing --platformlinux/amd64 DOCKER_ARGS --platformlinux/amd64 fi即通过docker image inspect读取镜像的Architecture与主机架构dpkg --print-architecture比对后自动注入平台参数全程无需人工干预。需要注意的是该能力依赖 Docker 在目标主机上的跨架构运行支持如 binfmt/qemu且模拟运行在性能上会有一定开销。控制 init 进程注入init-process 属性默认情况下scheduler-docker-local在启动应用容器时通过 Docker 的--init标志注入一个 init 进程用于回收僵尸进程。但对于某些应用——例如镜像内部本身已使用 S6 作为 init 的容器——额外的 init 进程注入可能反而导致进程启动异常。此时可为应用显式关闭 init 注入dokku scheduler-docker-local:set node-js-app init-process false如需重新启用将init-process置空即可空值会删除该属性恢复默认行为dokku scheduler-docker-local:set node-js-app init-process默认值也可以通过--global标志在全局范围配置应用级取值优先于全局值# 全局关闭 init 进程注入 dokku scheduler-docker-local:set --global init-process false # 清除全局值恢复默认true dokku scheduler-docker-local:set --global init-process一个重要的自动特判当既没有应用级值、也没有全局值时凡是带有org.opencontainers.image.vendorlinuxserver.io标签的镜像init 注入会被强制关闭无需任何手动配置。这是因为 linuxserver.io 的镜像统一使用 s6-overlay 作为 init。该逻辑在 plugins/scheduler-docker-local/bin/scheduler-deploy-process 中体现INJECT_INIT_FLAG$(fn-scheduler-docker-local-init-process $APP) if [[ -z $INJECT_INIT_FLAG ]]; then INJECT_INIT_FLAG$(fn-plugin-property-get-default scheduler-docker-local --global init-process ) fi if [[ -z $INJECT_INIT_FLAG ]]; then image_vendor$($DOCKER_BIN image inspect --format {{ index .Config.Labels org.opencontainers.image.vendor }} $IMAGE) if [[ $image_vendor linuxserver.io ]]; then INJECT_INIT_FLAGfalse else INJECT_INIT_FLAGtrue fi fi最终--init参数在容器创建时按INJECT_INIT_FLAG决定是否追加见 plugins/scheduler-docker-local/bin/scheduler-deploy-process-container。并行部署多个进程类型parallel-schedule-count 属性自 0.25.5 起支持。默认情况下Dokku 按顺序逐个部署应用的进程类型且web进程总是最先被部署。通过设置parallel-schedule-count属性默认值为1可以提升并行度——该值表示一次最多可并行调度多少个进程类型web进程除外。# 将并行度从每次 1 个进程类型提升到 4 个进程类型 dokku scheduler-docker-local:set node-js-app parallel-schedule-count 4恢复默认逐个部署dokku scheduler-docker-local:set node-js-app parallel-schedule-count同样支持全局配置应用级优先于全局dokku scheduler-docker-local:set --global parallel-schedule-count 4 dokku scheduler-docker-local:set --global parallel-schedule-count并行调度的失败语义若并行度提高后某个进程类型调度失败则已在执行中的进程类型会继续处理完毕尚未开始调度的进程类型会被跳过部署最终以失败收尾。另外容器调度的输出按接收顺序显示因此当存在 stderr 输出时展示顺序可能与实际调度顺序不一致属正常现象。性能注意事项提高parallel-schedule-count会显著增加主机 CPU 占用因为多个应用容器及其进程会同时启动。不建议把该值设置得高于主机的 CPU 核数请根据服务器实际负载谨慎取值以免压垮宿主机。从实现层面看scheduler-deploy触发器把除web之外的所有进程类型写入临时文件随后用 GNUparallel工具以--jobs指定并行度执行--halt soon,fail1表示任一失败即尽快终止web进程则始终被单独、首先处理见 plugins/scheduler-docker-local/scheduler-deploy。进程内部的并行度提升app.json max_parallel自 0.26.0 起支持。parallel-schedule-count控制的是不同进程类型之间的并行度而默认情况下同一个进程类型内部的多个实例仍然是逐个部署的。若要提升某进程类型内部实例的启动并行度可在应用的app.json中为对应进程类型设置formation键下的max_parallel{ formation: { web: { max_parallel: 1 }, worker: { max_parallel: 4 } } }省略或删除某个进程类型的max_parallel条目该进程类型将恢复为一次启动 1 个实例该机制可以与parallel-schedule-count组合使用进一步加速部署与上文相同的性能提醒同样适用max_parallel越大容器启动期间宿主机 CPU 占用越高不建议超过 CPU 核数。源码侧max_parallel是 plugins/app-json/appjson.go 中formation结构体定义的字段MaxParallel *int部署时通过app-json-process-deploy-parallelism触发器读取并传递给容器部署流程见 plugins/scheduler-docker-local/bin/scheduler-deploy-process。关于app.json的存放位置与自定义路径可参考 deployment-tasks 文档。查看调度器配置报告scheduler-docker-local:report使用scheduler-docker-local:report命令可以查看应用当前的调度器配置报告dokku scheduler-docker-local:report输出示例 node-js-app scheduler-docker-local information Scheduler docker local computed init process: true Scheduler docker local computed parallel schedule count:1 Scheduler docker local global init process: true Scheduler docker local global parallel schedule count: 1 Scheduler docker local init process: Scheduler docker local parallel schedule count:也支持针对单个应用查看dokku scheduler-docker-local:report node-js-app还可以通过 flag 只输出某一项的具体值便于脚本化取值dokku scheduler-docker-local:report node-js-app --scheduler-docker-local-computed-init-process使用--global时只报告全局键dokku scheduler-docker-local:report --global全部可用的报告键键含义--scheduler-docker-local-init-process应用级init-process原始值未设置时为空--scheduler-docker-local-computed-init-process生效的init-process值应用级优先其次全局值最后默认true--scheduler-docker-local-global-init-process全局init-process值默认true--scheduler-docker-local-parallel-schedule-count应用级parallel-schedule-count原始值未设置时为空--scheduler-docker-local-computed-parallel-schedule-count生效的并行度应用级优先其次全局值最后默认1--scheduler-docker-local-global-parallel-schedule-count全局并行度值默认1报告还支持 JSON 输出便于外部工具区分应用显式设置的值与回退到默认值dokku scheduler-docker-local:report node-js-app --format json报告功能的实现位于 plugins/scheduler-docker-local/report.goReportSingleApp为不同作用域--global与普通应用注册不同的报告 flag 集合而reportComputedInitProcess等计算函数严格遵循应用级 → 全局级 → 默认值的三级回退逻辑如reportComputedInitProcess在两层取值均为空时返回true。Shell 侧对应的取值函数fn-scheduler-docker-local-*定义于 plugins/scheduler-docker-local/internal-functions两者逻辑保持一致。调度器接口与能力范围scheduler-docker-local通过plugn触发器机制与 Dokku 核心集成在单机 Docker 上实现了以下功能apps:cloneapps:destroyapps:renamedeployenterlogsps:inspectps:stoprun对应到插件目录下的触发器脚本包括scheduler-deploy、scheduler-enter、scheduler-inspect、scheduler-logs、scheduler-run、scheduler-stop、scheduler-app-status、scheduler-register-retired、scheduler-retire、scheduler-is-deployed等构成了完整的容器生命周期管理链。日志支持logs命令的应用日志直接通过dockerCLI 从运行中的容器获取。由于容器被销毁后日志即丢失如需跨部署持久化日志建议使用 Dokku 的 vector 日志集成将日志发送到其他服务或第三方日志平台。支持的资源管理属性docker-local调度器支持少量资源limits限制与reservations预留属性通过 Dokku 的资源管理能力作用于 Docker 运行参数资源限制Resource Limits属性Docker 选项说明cpu--cpus进程可访问的 CPU 数量核数memory--memory内存限制须带后缀b字节、k千字节、m兆字节、g吉字节默认单位为mmemory-swap--memory-swap内存交换区限制后缀规则同上nvidia-gpus--gpus进程可访问的 NVIDIA GPU 数量资源预留Resource Reservations属性Docker 选项说明memory--memory-reservation内存软性预留后缀规则同上默认单位为m上述属性均映射到 Docker Runtime Options 文档中对应的资源约束语义实际生效参数由 Docker 守护进程执行。属性一览Settable propertiesscheduler-docker-local支持设置的全部属性汇总如下属性作用域默认值报告 flag描述init-process应用 全局true--scheduler-docker-local-init-process、--scheduler-docker-local-global-init-process、--scheduler-docker-local-computed-init-process为true时以 Docker 的--init标志运行容器回收僵尸进程linuxserver.io 镜像自动豁免parallel-schedule-count应用 全局1--scheduler-docker-local-parallel-schedule-count、--scheduler-docker-local-global-parallel-schedule-count、--scheduler-docker-local-computed-parallel-schedule-count一次部署中并行调度的最大容器数web进程除外两条属性均支持应用级优先、全局级兜底、内置默认值最后兜底的三级取值链且都能通过置空值的方式清除恢复默认配合--format json报告可以清晰审计每个应用实际生效的调度配置。对于大多数单机部署场景保持默认值即可只有在跨架构部署、自定义 init 或追求更快的大规模并发启动时才需要调整上述配置。【免费下载链接】dokkuA docker-powered PaaS that helps you build and manage the lifecycle of applications项目地址: https://gitcode.com/GitHub_Trending/do/dokku创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考