核心是通过--oom-score-adj配合--memory实现分级保护:-500降低关键服务被杀概率,+300~+500提高次要容器被杀概率,禁用OOM Killer风险极高,生产环境应避免。

在 Docker 中配置 OOM 控制策略,核心不是“关掉 OOM Killer”,而是让关键容器更难被杀、次要容器更早让出资源。必须配合内存限制使用,否则优先级调整无效。
用 --oom-score-adj 设置容器被杀的难易程度
Docker 20.10+ 支持直接通过 --oom-score-adj 参数设置优先级(范围 -1000 到 +1000):
- -500:显著降低被杀概率,适合数据库、核心 API 等关键服务
- 0:默认值,与宿主机普通进程一致
- +300~+500:提高被杀概率,适合批处理、临时任务类容器
- -1000:完全豁免 OOM Killer(仅限特权容器,且需内核支持)
示例:启动一个受保护的 Redis 容器
docker run -d --name redis-prod --oom-score-adj=-500 --memory=2g redis:7-alpine
验证是否生效:进入容器后执行 cat /proc/1/oom_score_adj,应返回设定值。
必须搭配 --memory 才真正起作用
单独调低 oom_score_adj 没有意义。OOM 评估发生在 cgroup 内存超限时,没有 --memory 就没有“超限”上下文:
- 给核心服务设合理硬限制:--memory=2g --memory-reservation=1.5g
- 给非关键服务加软性约束:--memory=512m --oom-score-adj=300
- 避免不设限:不加 --memory 或设为 unlimited 会让优先级参数失效
慎用 --oom-kill-disable
该参数会禁用 OOM Killer,但风险极高:
- 一旦容器内存失控,可能耗尽宿主机全部内存,拖垮整个系统
- 仅建议在极少数受控测试场景下临时启用
- 生产环境应始终保留 OOM Killer,靠 --oom-score-adj + --memory 实现分级保护
运行中容器的动态调整(旧版或调试用)
若 Docker 版本低于 20.10,或需临时修改已运行容器:
- 查主进程 PID:docker inspect -f '{{.State.Pid}}' 容器名
- 定位 cgroup 路径:cat /proc/<PID>/cgroup | grep memory
- 写入新值(需 root 权限):echo -300 > /sys/fs/cgroup/memory/xxx/oom_score_adj
注意:cgroup v2 默认启用后,oom_score_adj 不再直接暴露,此时应升级 Docker 并改用 --oom-score-adj 启动参数。


















