Docker容器通过Cgroups实现资源限制,内存需设硬上限(如-m 512m)并禁用Swap(--memory-swap 512m),CPU可用--cpus设硬限制或--cpu-shares设相对权重。

内存限制:必须设硬上限,且管住 Swap
内存不设限最危险:容器吃满内存后会被内核 OOM Kill,直接退出。
-
-m 或 --memory:物理内存硬上限,比如
-m 512m。超过就杀进程。 -
--memory-swap:内存 + Swap 总上限。若只设
-m 512m不设 swap,Docker 默认允许再用 512m Swap(共 1G),容易引发磁盘 IO 暴涨。生产环境建议设成同值,如--memory-swap 512m,等于禁用 Swap。 -
--memory-reservation:软限制,比如
--memory-reservation 256m。宿主机内存紧张时,Docker 会优先从这个容器回收内存,但它平时仍可跑到 512m。
CPU 份额:按权重分配,只在争抢时生效
--cpu-shares 不是“最多能用多少”,而是“相对能分到多少”。默认值是 1024,数值越大,在 CPU 竞争时拿到的时间片越多。
- 两个容器分别设
--cpu-shares=2048和--cpu-shares=1024,当 CPU 满载时,前者约得两倍 CPU 时间。 - 但空闲时,高权重容器也能跑满所有 CPU——它只是“更优先”,不是“独占”。
- 适合区分服务优先级,比如核心 API 容器设 2048,后台任务设 512。
更常用的 CPU 限制方式(补充说明)
如果目标是“绝对不能超用 CPU”,--cpu-shares 不够直观。这时推荐:
-
--cpus:硬性上限,支持小数。例如
--cpus=1.5表示最多用 1.5 个逻辑核心的算力,跨核调度,最常用。 -
--cpuset-cpus:绑定具体核心,如
--cpuset-cpus="0,2",只允许在 CPU 0 和 2 上运行,适合需要缓存亲和性或强隔离的场景(如数据库)。


















