内存溢出(OOM)是容器最危险故障,须设-m硬上限防宿主机崩溃;--memory-swap应禁用或严格限制Swap;--memory-reservation提供软保障;需通过cgroup文件和docker stats验证配额生效。内存溢出(OOM)是容器最危险的故障来源之一,一旦触发,Linux 内核会直接杀死容器内主进程,表现为容器状态变为 Exited (137),严重时甚至拖垮整台宿主机。Docker 本身不自动设限,必须手动配置内存配额,核心在于用好 cgroups 的硬限制机制。
必须设置内存硬上限(-m / --memory)
这是防 oom 的第一道、也是最关键的防线。不设此值,容器可无限制申请内存,极易耗尽宿主机物理内存。
- -m 512m 表示容器最多使用 512MB 物理内存,超限即被 OOM Killer 终止
- 值建议按应用实测峰值 + 20% 余量设定,例如 Java 应用堆内存设为 -Xmx384m,容器内存至少设为 512m
- 单位支持
m(MB)、g(GB),如-m 2g
明确控制 Swap 行为(--memory-swap)
Swap 不是“保险丝”,而是延迟问题爆发的陷阱。生产环境强烈建议禁用或严格限制 Swap,避免因换页导致响应延迟飙升、服务不可用。
-
--memory-swap 512m(与
-m值相同):完全禁用 Swap,只用物理内存 -
--memory-swap 1g(大于
-m):允许最多 512MB Swap(1g − 512m = 512m Swap) - --memory-swap -1:不限 Swap —— 不推荐,违背稳定性目标
为关键服务加一层软保障(--memory-reservation)
它不阻止超限,但在宿主机内存紧张时,告诉内核“这个容器的内存优先级更高”,降低被回收风险,适合负载波动大但又不能轻易被杀的服务。
- 例如:
--memory 1g --memory-reservation 512m,表示系统会尽量保障它有 512MB 可用 - 该值必须 ≤
--memory,否则容器启动失败 - 对延迟敏感型服务(如 API 网关、实时消息队列)很实用
验证配额是否真正生效
配置完别只信命令行,进容器看 cgroup 文件才是真实依据:
- 查内存上限:
docker exec cat /sys/fs/cgroup/memory/memory.limit_in_bytes(输出应为字节数,如 536870912 = 512MB) - 查 Swap 总限:
docker exec cat /sys/fs/cgroup/memory/memory.memsw.limit_in_bytes - 实时观察使用率:
docker stats,重点关注MEM USAGE / LIMIT列











