Docker内存软限制(--memory-reservation)是调度优先级机制,非强制约束,需配合--memory硬限制生效;内存紧张时,内核优先回收超软限但未达硬限的容器内存页,保障核心服务基本可用。
在 docker 中配置内存预留(即软限制),不是为了“防止容器被删”,而是让核心容器在系统内存紧张时,不被内核优先回收内存页,从而维持基本服务能力——这直接关系到容器是否因 oom 被杀,而非是否被 docker rm 删除。
内存预留的核心作用是调度优先级保障
Linux 内核通过 cgroups 的内存控制器,在内存压力升高时启动轻量回收(如清理 page cache、swap out)。此时,内核会参考每个控制组的 soft limit(软限制)来决定回收顺序:
- 未超软限制的容器,内存尽量保留;
- 已超软限制且未设硬限制的容器,会被优先压缩或回收页;
- 即使超了软限制,只要没触达硬限制,进程仍可继续分配内存,不会立即被终止。
必须搭配硬限制才生效
--memory-reservation 单独设置无效。Docker 要求必须同时指定 --memory(硬限制),软限制才会被写入 cgroup 的 memory.soft_limit_in_bytes(cgroups v1)或 memory.low(cgroups v2)。
- 示例:保障 Nginx 容器至少有 384MB 可用,上限为 768MB
--memory=768m \
--memory-reservation=384m \
--name nginx-core \
nginx:alpine
配合 OOM 优先级进一步加固
软限制影响内存回收,而 --oom-score-adj 影响进程被 OOM Killer 终止的概率。对核心容器应设为负值,降低被杀风险:
-
--oom-score-adj=-500:大幅降低被选中概率; - 注意:需 root 权限运行,且不能低于 -1000;
- 与软限制组合使用效果更稳,例如:
--memory=768m \
--memory-reservation=384m \
--oom-score-adj=-500 \
--name nginx-core \
nginx:alpine
验证配置是否生效
容器启动后,可通过以下方式确认软限制已写入:
- 查 cgroup 路径(以 systemd 驱动为例):
cat /sys/fs/cgroup/memory/docker/*/memory.soft_limit_in_bytes(v1)
或
cat /sys/fs/cgroup/docker/*/memory.low(v2) - 实时观察内存行为:
docker stats nginx-core --no-stream,关注 MEM USAGE 是否长期稳定在软限制附近,压力下是否比其他容器更少触发 swap 或回收。


















