Docker容器通过Linux内核cgroups实现内存限制,需宿主机启用memory cgroup和swap accounting;启动时用-m设硬限制(如-m 512m),必须同步配置--memory-swap(如=512m禁用swap)以防默认启用等量swap导致OOM不可控。
docker engine 本身不需要额外“安装内存限制功能”——它原生支持基于 cgroups 的内存控制,只要宿主机内核启用相关能力,启动容器时直接加参数即可生效。关键不在 engine 安装步骤,而在安装后的宿主机配置和运行时参数使用。
宿主机内核需启用 memory cgroup 支持
很多用户在首次设置 -m 时遇到警告:WARNING: Your kernel does not support swap limit capabilities, memory limited without swap.
这是因为默认内核未开启 memory cgroup 和 swap accounting。必须手动启用:
- 编辑
/etc/default/grub,修改GRUB_CMDLINE_LINUX行为:GRUB_CMDLINE_LINUX="cgroup_enable=memory swapaccount=1" - 执行
sudo update-grub - 重启系统(必须,仅 reload 内核模块无效)
容器启动时设置内存硬限制(最常用)
使用 --memory(或 -m)指定物理内存上限,单位支持 b、k、m、g:
-
docker run -m 512m nginx:最多用 512 MiB 物理内存,超限即被 OOM Killer 终止(退出码 137) - 该值也是 cgroup 中
memory.limit_in_bytes的实际写入值 - 最小允许值为 4M;不设则无限制,可吃光宿主机全部内存
必须同步配置 --memory-swap,否则 swap 行为不可控
只设 -m 512m 时,Docker 默认把 --memory-swap 设为 1g(即 512m 物理 + 512m swap),导致容器实际能 malloc 接近 1GB 才 OOM——这常引发误判。
- 要严格限制总内存为 512MB(禁用 swap):
docker run -m 512m --memory-swap=512m nginx - 要允许最多 512MB swap(即总上限 1GB):
docker run -m 512m --memory-swap=1g nginx -
--memory-swap值不能小于--memory,否则报错
按场景选配软限制提升资源弹性
对多服务共存环境,建议搭配 --memory-reservation 设置软限制:
-
docker run -m 1g --memory-reservation 512m nginx
容器在空闲时可接近用满 1GB,但当宿主机内存紧张时,内核会优先回收其超出 512MB 的部分 - 软限制不是硬边界,不触发 OOM;适合 Java、Node.js 等有内部缓存机制的服务
- 生产中建议:软限制 ≥ 应用常驻内存,硬限制 ≥ 软限制 + 预留峰值余量


















