设置--memory参数可为容器添加内存硬限制,超出即触发OOM Killer终止主进程;支持docker run、docker update和docker-compose三种配置方式,并需注意swap禁用、软硬限制搭配及Java堆上限对齐等关键点。

直接设置 --memory(或 -m)参数,就能为容器加上内存硬限制。它像一道物理闸门:一旦容器实际使用内存超过该值,内核会立即触发 OOM Killer 终止容器内主进程,从而阻止内存泄漏持续蔓延、拖垮宿主机。
硬限制的核心作用
硬限制不是“建议”或“预警”,而是强制截断机制。Docker 通过 Linux cgroups 的 memory.limit_in_bytes 实现,超出即杀,不等待、不交换(除非显式启用 swap)。这对防止 Java 应用未调 JVM 堆上限、Python 进程缓存失控、或 Node.js 内存持续增长导致整机卡死特别有效。
三种常用配置方式
-
单次运行时设置:适合测试或临时部署
docker run -d --memory=1g --name myapp nginx
容器最多用 1GB 物理内存,超限立刻被杀 -
更新已有容器:无需重启,即时生效(需容器处于运行或暂停状态)
docker update --memory=512m myapp
注意:不能对已停止的容器直接 update 内存,需先start再 update -
Docker Compose 中配置:适用于多服务编排
在docker-compose.yml的 service 下写:mem_limit: 2g(v2/v3 非 Swarm 模式)
或
deploy:<br> resources:<br> limits:<br> memory: 2G
(Swarm 模式)
关键搭配与避坑点
- 禁用 swap 更安全:加
--memory-swap=1g(与--memory值相同),避免因换页掩盖问题、延迟 OOM 触发 - 不要只设硬限制:建议同步配
--memory-reservation=512m(软限制),让系统在内存紧张时优先压缩高内存容器,保留关键服务可用性 - Java 容器要双控:硬限制(
--memory)必须 ≥ JVM 堆上限(-Xmx),否则容器可能因堆外内存(如 Metaspace、Direct Buffer)超限被杀,而 JVM 还没报错 - 单位大小写敏感:用
m或M都可,但g和G含义一致;避免写成MB或GB(Docker 不识别)
验证是否真正生效
启动后立刻执行:docker stats myapp —— 查看 “MEM USAGE / LIMIT” 是否显示你设定的上限值docker inspect myapp | grep -A 5 Memory —— 确认 Memory 和 MemorySwap 字段数值准确
再进容器制造内存压力(如 dd if=/dev/zero of=/tmp/big bs=1M count=2000),观察是否在接近限制时被自动终止


















