在 docker-compose.yml 中实现资源硬限制需使用 deploy.resources.limits,仅在 docker stack deploy 下完全生效;cpus 以逻辑核数设 cpu 上限(如 '1.2'),memory 以带单位值设内存上限(如 800m),超限将被节流或 oom 终止。

在 docker-compose.yml 中实现精细化的资源配额硬限制,核心是使用 deploy.resources.limits 字段,并确保语法、单位和上下文都符合 Docker 引擎要求。硬限制(如 cpus 和 memory)一旦触发,系统会强制节流或终止容器,因此配置必须准确、可验证。
明确使用 deploy 结构并指定 limits
硬限制只能通过 deploy.resources.limits 声明,且仅在 docker stack deploy 模式下 100% 生效;docker-compose up 可能忽略部分字段(尤其旧版 Compose)。务必写全层级:
-
version: '3.8'或更高(推荐'3.9') -
deploy:必须缩进在服务下,不可省略 -
resources:下只放limits:(硬限)和可选的reservations:(软保)
CPU 硬限制:用 cpus 控制核数占比
cpus 是最直接的 CPU 硬限制,单位为逻辑核数(小数表示比例),底层映射到 cfs_quota_us / cfs_period_us。例如:
-
cpus: '0.75'→ 最多占用 0.75 个逻辑 CPU 核(即 75% 单核算力) -
cpus: '2.0'→ 最多用满 2 个逻辑核,超载时被内核节流 - 不支持
cpu_shares实现硬限——它只是竞争时的相对权重,空闲时不限制
内存硬限制:用 memory 防止 OOM 杀死宿主机
memory 是真正的硬边界,超出将触发 Linux OOM Killer 终止容器内进程(非整个容器,除非无进程可杀)。注意:
- 单位必须带后缀:
512m、1g、2048k(大小写不敏感,但推荐小写) - 避免设得过大:建议不超过宿主机物理内存的 40%,留足系统与 Docker 自身开销
- 搭配
memswap_limit可控制 swap 使用上限(如memswap_limit: 1g,含memory)
完整可运行示例
以下是一个生产就绪的硬限制配置片段:
version: '3.9'
services:
api:
image: myapp:latest
deploy:
resources:
limits:
cpus: '1.2'
memory: 800m
memswap_limit: 1g
reservations:
memory: 400m
该配置表示:api 容器最多用 1.2 个 CPU 核、800MB 物理内存;若启用 swap,总虚拟内存上限为 1GB;启动时至少预留 400MB 内存供其稳定运行。











