资讯动态

Dokku 资源管理实战指南:使用 resource 插件为应用设置资源限制与预留

发布时间:2026/9/10 14:03:37 来源:尧图企业网站定制
Dokku 资源管理实战指南使用 resource 插件为应用设置资源限制与预留【免费下载链接】dokkuA docker-powered PaaS that helps you build and manage the lifecycle of applications项目地址: https://gitcode.com/GitHub_Trending/do/dokku本指南系统讲解 Dokku 内置resource插件自 0.15.0 起提供的使用方法它允许你在单台服务器上按应用app或进程类型process-type维度为容器设置资源限制limit与预留reservation并对构建阶段build phase单独施加内存与 CPU 约束0.38.0 起。读完本文你将掌握resource:limit、resource:reserve、resource:report等全部子命令的用法、特殊值clear与build进程类型的正确姿势并理解这些命令背后如何映射为底层调度器的容器参数如 Docker 的--cpus、--memory、--gpus。概述为何需要资源管理默认情况下Dokku 允许部署在服务器上的应用无限访问宿主机资源。在多应用共享一台服务器、或需要按用户/项目隔离资源时这种放任自流的方式并不合适。resource插件解决的就是这一诉求在应用维度或进程类型维度上同时管理两类资源约束资源限制limit当指定并受支持时保证应用进程不超过指定值一旦超限底层调度器可能会限制资源使用也可能直接终止并重新调度该进程。资源预留reservation当指定并受支持时保证在调度应用进程之前服务器上至少有指定资源可供使用若发生资源耗尽后续的 rebuild 与 deploy 可能失败。插件提供的全部命令如下出自原文档resource:limit [--process-type process-type] [RESOURCE_OPTS...] app # Limit resources for a given app/process-type combination resource:limit-clear [--process-type process-type] app # Limit resources for a given app/process-type combination resource:report [app] [flag] # Displays a resource report for one or more apps resource:reserve [--process-type process-type] [RESOURCE_OPTS...] app # Reserve resources for a given app/process-type combination resource:reserve-clear [--process-type process-type] app # Reserve resources for a given app/process-type combination使用前必读的两条警告[!WARNING]值的语义与单位由应用所使用的调度器决定。如果某个值对该调度器不正确可能导致容器无法正常启动如果调度器不支持某种资源类型组合该配置会被静默忽略。另外所有 resource 命令都需要对应用执行 rebuild 或 deploy 才能生效测试 tests/unit/resource_1.bats 中的用例也验证了这一点设置--memory 512MB后必须ps:rebuild容器HostConfig.Memory才会由0变为536870912即 512MB。[!WARNING]资源预留只在应用的run与deploy阶段生效资源限制除此之外还可以在显式针对build进程类型配置时作用于构建阶段详见下文构建时资源限制。支持的资源选项所有resource:limit/resource:reserve命令共享同一组可选资源项选项含义--cpu进程可访问的 CPU 数量--memory内存上限/预留--memory-swap交换内存上限/预留--network网络带宽限制/预留--network-ingress入站网络带宽限制/预留--network-egress出站网络带宽限制/预留--nvidia-gpu进程可访问的 Nvidia GPU 数量这些选项与源码中 Resource 结构体 的字段一一对应cpu、memory、memory-swap、network、network-ingress、network-egress、nvidia-gpu其 JSON 标签即为底层属性键名。每种资源如何映射到底层容器运行时取决于应用使用的调度器。以 Dokku 默认的docker-local调度器为例其支持情况见 docker-local 调度器文档 的 Supported Resource Management Properties 一节limitcpu→ Docker--cpus单位为 CPU 核数memory→--memorymemory-swap→--memory-swapnvidia-gpus→--gpusNvidia GPU 个数。reserve仅memory→--memory-reservation。其中内存类参数支持b字节、k千字节、m兆字节、g吉字节后缀默认单位为m兆字节——这一默认行为由源码 addMemorySuffixForDocker 实现当memory值不带b/k/m/g/KB/MB/GB/B后缀时自动补上m。也就是说--memory 100与--memory 100m等价。网络相关选项network、network-ingress、network-egress在 docker-local 调度器下不被支持配置后会被忽略。设置资源限制resource:limit基本用法通过resource:limit为应用设置限制命令执行后会打印逐项确认信息dokku resource:limit --memory 100 node-js-app Setting resource limits for node-js-app memory: 100多个资源可在一次调用中同时设置dokku resource:limit --cpu 100 --memory 100 node-js-app Setting resource limits for node-js-app cpu: 100 memory: 100按进程类型设置资源限制也可以按进程类型设置。一旦指定进程类型的限制会覆盖为该应用设置的通用限制dokku resource:limit --cpu 100 --memory 100 --process-type worker node-js-app Setting resource limits for node-js-app (worker) cpu: 100 memory: 100单项清除特殊值clear某个资源项可以被单独清除只需把值设为特殊值cleardokku resource:limit --cpu clear node-js-app Setting resource limits for node-js-app cpu: cleared从源码 setResourceType 可以看出clear与空值的处理逻辑不同空值表示本次调用不涉及该项直接跳过而clear会调用PropertyDelete删除对应属性键实现单项清除。查看已配置的限制不带任何资源选项直接运行resource:limit会展示应用当前的默认defaults限制dokku resource:limit node-js-app resource limits node-js-app information [defaults] cpu: memory: memory-swap: 100 network: 100 network-ingress: network-egress: nvidia-gpu:也可以结合--process-type查看某一进程类型级别的限制。注意展示的值不会与默认值合并即进程类型列中留空并不意味着继承默认值dokku resource:limit --process-type web node-js-app resource limits node-js-app information (web) cpu: 100 memory: 100 memory-swap: network: network-ingress: network-egress: nvidia-gpu:构建时资源限制Build-time Resource Limits[!IMPORTANT] 该能力自 0.38.0 起提供。默认情况下构建阶段buildphase不受任何资源约束。借助特殊的build进程类型可以给构建容器施加内存与 CPU 限制dokku resource:limit --memory 4g --process-type build node-js-app Setting resource limits for node-js-app (build) memory: 4g以下几点是该机制的关键语义生效机制构建时限制通过docker-args-process-build插件触发器应用见 triggers.go最终拼装出给构建容器的 Docker 参数。不继承默认值构建时限制不会从默认_default_限制继承只有显式设置在build进程类型上的限制才会在构建阶段生效。这是有意为之——构建阶段往往比运行时进程需要更多内存若静默继承一个较小的运行时内存限制会导致令人困惑的 OOM 失败。build名称保留不要在Procfile中把build用作运行时进程类型。build这个名字被 resource 插件保留用于将限制作用域限定到构建容器若把它写成 Procfile 条目这些限制也会被应用到对应运行时容器上。各 builder 对构建时限制的支持情况仅 limit 生效resource:reserve永不应用于构建阶段Builder--cpu--memory--memory-swap--nvidia-gpuherokuishyesyesyesyesdockerfilenoyesyesnopacknononononixpacksnonononorailpacknonononolambdanononono这张表与源码中 validBuildLimitsForBuilder 的实现完全一致只有herokuish支持 cpu/memory/memory-swap/nvidia-gpu与dockerfile仅 memory/memory-swap返回非空的能力集合其余 builder 返回空 map构建阶段资源参数会被整体跳过。超出 builder 支持范围的资源键会被静默忽略。清除资源限制resource:limit-clear当值配置错误或不再希望限制资源时使用resource:limit-cleardokku resource:limit-clear node-js-app----- Clearing resource limit for node-js-app不指定应用名即可清除全局默认限制dokku resource:limit-clear----- Clearing default resource limits从源码 clearByResourceType 可知其实现细节当不指定进程类型时会遍历该应用的全部 resource 属性并逐一删除指定进程类型时则针对该进程类型下的 7 个资源键cpu、memory、memory-swap、network、network-ingress、network-egress、nvidia-gpu分别执行PropertyDelete。--process-type参数同样适用于清除命令例如dokku resource:limit-clear --process-type worker node-js-app只清除 worker 类型的限制。设置资源预留resource:reserve资源预留的用法与 limit 完全对称通过resource:reserve设置dokku resource:reserve --memory 100 node-js-app Setting resource reservation for node-js-app memory: 100同样支持一次设置多项dokku resource:reserve --cpu 100 --memory 100 node-js-app Setting resource reservation for node-js-app cpu: 100 memory: 100同样支持按进程类型设置且进程类型级别的预留会覆盖应用级通用预留dokku resource:reserve --cpu 100 --memory 100 --process-type worker node-js-app Setting resource reservation for node-js-app (worker) cpu: 100 memory: 100单个预留项同样可以通过特殊值clear清除dokku resource:reserve --cpu clear node-js-app Setting resource reservation for node-js-app cpu: cleared查看与清除预留不带资源选项运行resource:reserve展示默认预留带--process-type展示进程类型级预留同样不与默认值合并dokku resource:reserve node-js-app resource reservation node-js-app information [defaults] cpu: 100 memory: 100 memory-swap: network: network-ingress: network-egress: nvidia-gpu:dokku resource:reserve --process-type web node-js-app resource reservation node-js-app information (web) cpu: 100 memory: 100 memory-swap: network: network-ingress: network-egress: nvidia-gpu:清除预留使用resource:reserve-clear同样支持指定应用或清除全局默认dokku resource:reserve-clear node-js-app----- Clearing resource reservation for node-js-appdokku resource:reserve-clear----- Clearing default resource reservation查看资源报告resource:reportresource:report用于获取一个或多个应用的资源状态总览。不带应用名时会列出所有应用的信息该逻辑见 CommandReport先通过DokkuApps()枚举全部应用再逐个输出报告dokku resource:report node-js-app resource information web limit cpu: web limit memory: 1024 web limit memory swap: 0 web limit network: 10 web limit network ingress: web limit network egress: web limit nvidia gpu: web reservation cpu: web reservation memory: 512 web reservation memory swap: web reservation network: 8 web reservation network ingress: web reservation network egress: web reservation nvidia gpu: python-sample resource information web limit cpu: web limit memory: web limit memory swap: web limit network: web limit network ingress: web limit network egress: web limit nvidia gpu: web reservation cpu: web reservation memory: web reservation memory swap: web reservation network: web reservation network ingress: web reservation network egress: web reservation nvidia gpu: ruby-sample resource information web limit cpu: web limit memory: web limit memory swap: web limit network: web limit network ingress: web limit network egress: web limit nvidia gpu: web reservation cpu: web reservation memory: web reservation memory swap: web reservation network: web reservation network ingress: web reservation network egress: web reservation nvidia gpu:也可以只查询单个应用dokku resource:report node-js-app node-js-app resource information web limit cpu: web limit memory: 1024 web limit memory swap: 0 web limit network: 10 web limit network ingress: web limit network egress: web limit nvidia gpu: web reservation cpu: web reservation memory: 512 web reservation memory swap: web reservation network: 8 web reservation network ingress: web reservation network egress: web reservation nvidia gpu:若只需某个具体值可以传入信息标志注意标志名中的句点dokku resource:report node-js-app --resource-web.limit.memory1024报告标志名的构造逻辑见 ReportSingleApp插件读取该应用的全部 resource 属性后将每个属性键key映射为--resource-key形式的标志例如属性键web.limit.memory对应标志--resource-web.limit.memory因此凡报告中出现的键都可以作为标志单独查询。底层原理属性存储与触发器理解 resource 插件的工作方式关键是明白它的数据模型与生效链路。属性存储模型所有限制与预留都存储为应用级键值对属性键的格式为进程类型.资源类型.资源键即processType.resourceType.key构造逻辑见 propertyKey。例如--memory 100 node-js-app默认写入_default_.limit.memory 100而--process-type worker则写入worker.limit.memory 100。查询时 GetResourceValue 会先匹配进程类型专属键找不到再回退到_default_前缀的默认值——这就是进程类型覆盖默认值的实现基础。容器参数注入应用部署或运行时TriggerDockerArgsProcessDeploy 触发器读取属性并将其翻译成调度器参数。翻译过程中有两处值得注意的键名改写cpu→cpus对应 Docker--cpus、nvidia-gpu→gpus对应 Docker--gpus。同时该触发器只认两类资源limit 有效键cpu、nvidia-gpu、memory、memory-swapreserve 有效键仅memory对应--memory-reservation。其余键即使被写入属性也不会生成容器参数。此外设置环境变量DOKKU_OMIT_RESOURCE_ARGS1可以整体跳过资源参数的注入用于临时排查或外部接管资源管理。生命周期管理插件还通过触发器保持属性与应用生命周期同步——安装时初始化属性存储TriggerInstall见 triggers.goapps:clone时克隆属性TriggerPostAppCloneSetupapps:rename时先克隆再销毁旧属性TriggerPostAppRenameSetup应用删除时清理属性TriggerPostDelete。生效前提资源参数只在容器创建时生效因此文档反复强调修改 resource 配置后必须 rebuild 或 deploy。测试 tests/unit/resource_1.bats 正是通过docker inspect --format {{.HostConfig.Memory}}断言 rebuild 前后容器内存上限从0变为536870912512MB验证了该链路端到端可用。小结与最佳实践场景推荐命令限制应用内存默认单位 MBdokku resource:limit --memory 512 node-js-app限制单个进程类型dokku resource:limit --cpu 1 --memory 512 --process-type worker node-js-app约束构建阶段内存dokku resource:limit --memory 4g --process-type build node-js-app需 0.38.0为进程预留内存dokku resource:reserve --memory 256 node-js-app单独清除某项dokku resource:limit --cpu clear node-js-app全部清除dokku resource:limit-clear node-js-app不指定应用则清全局默认查看现状dokku resource:report node-js-app --resource-web.limit.memory实践要点归纳区分 limit 与 reserve 的语义limit 是硬顶超限会被限流或杀掉重排reserve 是保证有资源不足时 rebuild/deploy 会失败。两者可独立设置、互不合并。记住进程类型覆盖规则进程类型级别配置覆盖应用级默认配置且报告显示不合并build进程类型特殊仅用于构建阶段且不继承默认限制。注意调度器差异不同调度器支持的资源项不同如 docker-local 不支持网络类限制不支持的项会被静默忽略配置前请对照 docker-local 调度器文档 核对。修改后必须重建所有 resource 配置变更都需要dokku ps:rebuild app或重新 deploy 才会作用于容器。【免费下载链接】dokkuA docker-powered PaaS that helps you build and manage the lifecycle of applications项目地址: https://gitcode.com/GitHub_Trending/do/dokku创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价