Docker Desktop 不干预容器 CPU 限制,可直接用 --cpus 或 docker-compose.yml 中 deploy.resources.limits.cpus(需加引号)配置;但受限于 macOS/Windows 底层 Linux VM 的 cgroup 支持,且需同步限制 Docker Desktop 自身的 VM 资源上限。

直接说结论:Docker Desktop 本身不干预单个容器的 CPU 限制,你照常在 docker run 或 docker-compose.yml 里配 --cpus 就行;但必须注意——宿主机是 macOS/Windows,Docker Desktop 底层跑的是 Linux VM,所以最终生效依赖 VM 内核的 cgroup 支持,且不能指望 Windows Subsystem for Linux(WSL2)或 Hyper-V 虚拟层完全透传所有调度行为。
docker run 里用 --cpus 最简单有效
这是绝大多数场景该选的方式,数值含义清晰、配置无歧义、Docker 自动换算底层 cgroup 参数:
-
--cpus=1.2表示容器最多使用 1.2 个逻辑 CPU 核心(比如在 4 核机器上 ≈ 30% 总 CPU 时间) - 数值支持小数,
--cpus=0.5常用于后台低优先级任务(如日志轮转、健康检查) - 它本质是软限制:空闲时可跑满,争抢时被节流;不会预留 CPU,也不保证最低可用量
- 不要和
--cpu-shares混用——后者只在多个容器同时争抢 CPU 时起相对权重作用,单容器下无效
docker-compose.yml 中 cpus 字段必须写成字符串
YAML 解析对浮点数敏感,直接写 cpus: 1.5 可能被解析成 float 导致 Compose 启动失败或静默忽略:
- 正确写法:
cpus: '1.5'(带单引号)或cpus: "1.5"(双引号) - 位置必须在
deploy.resources.limits下,不是resources.limits(v3.8+ 才支持顶层resources,Desktop 默认用 v3.x) - 完整路径示例:
services.app.deploy.resources.limits.cpus - 如果用了
scale或多实例部署,每个副本都独立受此限制
验证是否真生效,别只看 docker stats
docker stats 显示的 %CPU 是基于容器内进程的用户态/内核态时间计算的,容易受采样窗口、VM 虚拟化开销干扰,不可靠:
- 进容器跑
stress-ng --cpu 4 --timeout 30s(需提前装好 stress-ng),再回宿主机执行docker stats --no-stream看峰值是否卡在设定值附近 - 查底层 cgroup 配置更准:
docker inspect | grep -i cpu→ 关注CpuCount(v2)或CpuQuota/CpuPeriod(v1) - 在 Docker Desktop 的 macOS 上,还可查 VM 内对应路径:
docker run --rm -it --privileged alpine cat /sys/fs/cgroup/cpu/docker//cpu.max(cgroup v2) - 注意:Windows(WSL2)下部分 cgroup 文件可能不可读,此时以
docker stats+ 实际负载压测为准
别忘了 Docker Desktop 自身的全局资源上限
即使单个容器设了 --cpus=0.5,如果 Docker Desktop VM 被允许占用 8 核,它仍可能吃掉宿主机大量 CPU——这不是容器配额的问题,而是虚拟机“太贪”:
- macOS:点右上角 ? → Settings → Resources → Advanced → 把
CPUs调到物理核心数的 50%~75% - Windows:右键托盘图标 → Settings → Resources → WSL Integration 或 Advanced → 同样限制 VM 可用核数
- 这个设置影响所有容器的“天花板”,比如 VM 只分到 2 核,那就算你给某个容器设
--cpus=4,它也顶多用满这 2 核 - 内存同理:
Memory限制没调低,单个容器--memory=512m也拦不住 VM 整体吃光 12GB
真正容易被忽略的点是:Docker Desktop 的资源限制开关藏得深,且修改后必须点 Apply & Restart 才生效;而容器级 --cpus 配置一旦写错格式(比如 YAML 里漏引号),Compose 会静默降级,你以为限住了,其实没限。动手前先用 docker run --rm --cpus=0.3 busybox echo ok 快速验证基础能力是否通路。


















