Docker 27原生支持不重启容器动态扩容内存硬限制,通过docker update --memory命令毫秒级生效,依赖cgroups v2和Linux 5.15+内核,仅支持增大不可缩小。
可以在不重启容器的前提下动态扩容内存硬限制,但具体能否成功,取决于你使用的容器运行时和底层机制支持情况。核心前提是:容器必须运行在支持 cgroups v2 的 linux 内核上,且运行时需提供资源热更新接口。
确认运行时是否支持内存热更新
不同运行时能力差异明显:
-
Docker:支持,使用
docker update命令可直接修改--memory限制(仅限增大,不能缩小) -
CRI-O:支持,通过 CRI-O API 的
PATCH /v1/containers/{id}/resources接口更新memory.max -
Kubernetes Pod(v1.35+):若配置了
resizePolicy中memory: NotRequired,则可通过kubectl patch --subresource=resize实现原地扩容 - 旧版 K8s 或未开启 resizePolicy:默认会触发容器重启,不满足“不重启”前提
使用 docker update 动态扩容内存(最常用)
适用于 Docker 环境,操作简单、无需写 JSON 或调用 API:
- 查看当前内存限制:
docker inspect -f '{{.HostConfig.Memory}}' <container-name> - 将内存上限从 512MB 扩容到 2GB:
docker update --memory=2g <container-name> - 验证变更:
cat /sys/fs/cgroup/memory/docker/<container-id>/memory.max(值应为2147483648)
注意:该操作只修改运行时 cgroup 配置,不会影响镜像或下次重建的默认值。
通过 CRI-O API 手动更新 memory.max
适用于 Kubernetes + CRI-O 环境,适合脚本化或自动化场景:
- 准备 JSON 文件
mem-update.json:{"resources": {"limits": {"memory": "2Gi"}} - 调用 PATCH 接口:
curl -X PATCH --unix-socket /var/run/crio/crio.sock -H "Content-Type: application/json" -d @mem-update.json http://localhost/v1/containers/<container-id>/resources - CRI-O 会同步更新对应 cgroup v2 路径下的
memory.max文件
关键限制与注意事项
即使技术上可行,也要留意以下实际约束:
- 内存只能增大,不能减小(cgroups v2 不允许 runtime 缩小
memory.max) - 宿主机必须有足够空闲内存,否则更新请求会被内核拒绝
- 容器内应用不会自动感知新内存上限,需自行适配(如 JVM 需要
-XX:+UseContainerSupport才能读取 cgroup 限制) - 某些老旧内核(


















