--memory 解决什么问题
docker run --memory 为容器设置 cgroup 内存硬上限:用量触到上限时由内核 OOM killer 直接杀掉容器内进程,退出码 137,应用自身往往来不及留日志。它通常和软限 --memory-reservation 一起用,两者语义不同。
基本信息
| 用途 | 内存硬上限(cgroup v2 对应 memory.max) |
|---|---|
| 语法 | --memory=512m 或 -m 1g |
| 配套 | --memory-reservation 软限,内存紧张时优先回收超出部分 |
| 相关 | --memory-swap 限制内存加 swap 的总量 |
| 查看 | docker stats 看用量,docker inspect -f '{{.HostConfig.Memory}}' 看设置值 |
典型使用场景
- 多个服务共用一台宿主:逐个设上限,防止一个服务把内存吃光拖垮邻居
- 复现线上 OOM:本地按线上限额运行,提前暴露内存增长问题
- 给 JVM、Node 等服务定上限后同步调整堆参数,避免语言运行时按宿主内存估算
- 压测与单测中限定被测服务资源,保证每次跑出来的结果可比
- 在两核两 G 的小 VPS 上跑多个容器时做基本的资源隔离
- 排查内存泄漏:设一个偏高的上限后持续观察 MEM USAGE 曲线,比在宿主看总内存更容易定位是谁在涨
示例
示例
docker run -d --name api \
--memory=512m --memory-reservation=384m --memory-swap=1g \
app/api:1.4.2
docker stats --no-stream api # MEM USAGE / LIMIT 两列对照
docker inspect -f '{{.HostConfig.Memory}} {{.HostConfig.MemoryReservation}}' api
docker inspect -f '{{.State.OOMKilled}}' api # 被杀过就是 true几个内存参数的差别
| 参数 | 含义 | 使用建议 |
|---|---|---|
| --memory | 硬上限,超过即被杀 | 长期运行的服务都该设置 |
| --memory-reservation | 软限,内存紧张时优先回收超出的部分 | 按常态占用设,可低于硬限 |
| --memory-swap | 内存加 swap 的总配额,等于 --memory 时禁用 swap | 延迟敏感的服务禁用 swap |
| --oom-kill-disable | 禁止 OOM 杀容器内进程 | 仅特殊场景,误用会让宿主机整体失去响应 |
限额按 cgroup 计量,含应用堆、运行时缓存与 tmpfs 占用,不是只看进程 RSS;Java 容器要配 -XX:MaxRAMPercentage 之类参数让堆跟随限额,否则运行时会算错可用内存。
判断是否被内存限制杀掉,看 docker inspect 的 OOMKilled 标记或 docker events 里的 oom 事件,比翻应用日志更快定位。
docker stats 的 MEM USAGE / LIMIT 是限额使用率;用量长期贴住上限说明余量已不足,加限之前先看趋势是平稳抬升(泄漏)还是随请求波动(正常峰值)。