硬限制防崩溃、软限制保弹性,二者必须协同:硬限制须设为峰值内存上浮20%~30%,软限制设为硬限的50%~70%;禁用特权模式、强制非root运行、启用用户命名空间映射、根文件系统只读,并通过docker inspect、cAdvisor和stress-ng验证配置实效。
软硬限制不是二选一,而是协同配合:硬限制防崩溃,软限制保弹性。关键在于让容器在空闲时用足资源、争抢时主动让出,既不浪费也不越界。
硬限制必须设,且要留缓冲
硬限制(--memory)是安全底线,超出即触发 OOM Killer。不能省略,也不能按平均值设:
- 参考应用峰值内存使用(如压测数据),再上浮 20%~30% 作为硬限制值
- 例如 Java 应用实测峰值 1.2GB,建议设
--memory=1.6g,而非刚好 1.2g - 绝不只设
--memory-reservation而不设--memory,否则容器可能吃光宿主机内存
软限制要合理,小于硬限制才有意义
软限制(--memory-reservation)是调度优先级信号,不是“保证能用这么多”,而是“压力下希望至少留这么多”:
- 设为硬限制的 50%~70%,比如硬限 1.6GB,软限可设
--memory-reservation=1g - 软限高于实际常用内存,但低于硬限;太低会让容器频繁被回收,太高则失去调度价值
- 它只在系统内存紧张时生效——平时容器仍可涨到硬限,不影响业务性能
配合运行时加固,堵住隐性风险
光靠内存参数不够,需叠加基础安全控制:
- 禁用特权模式:绝不用
--privileged,改用细粒度能力(如--cap-add=NET_BIND_SERVICE) - 强制非 root 运行:
--user 1001:1001+ Dockerfile 中USER 1001 - 启用用户命名空间映射:在
/etc/docker/daemon.json加"userns-remap": "default" - 根文件系统只读:
--read-only,配--tmpfs /tmp:rw,size=64m提供临时写入空间
监控与验证不能少
配置完要确认是否生效,并持续观察真实行为:
- 查实时限制:
docker inspect 容器名 | grep -A 5 Memory - 看内存走势:用
cAdvisor或docker stats观察MEM USAGE / LIMIT和MEM % - 模拟压力测试:用
stress-ng --vm 1 --vm-bytes 2G等工具触发内存争抢,验证软限是否影响回收优先级 - 检查 OOM 事件:
dmesg -T | grep -i "killed process"



















