You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Docker Compose无法为容器设置CPU限制的技术求助

Docker Compose 无法设置CPU限制的问题

我需要在docker-compose文件中为容器设置CPU限制。

使用docker run命令可以正常实现:

docker run -d --rm --cpus 0.3 --name aaa progrium/stress -c 8 -t 20s

通过docker stats查看,容器CPU占用率符合预期(约30%):

CONTAINER ID   NAME                                               CPU %     MEM USAGE / LIMIT     MEM %     NET I/O           BLOCK I/O         PIDS
d6be318a85e6   aaa                                                29.01%    1.328MiB / 3.805GiB   0.03%     806B / 0B         0B / 0B           9

docker inspect也能看到CPU限制已正确设置:

$ docker inspect aaa | grep -i cpu
            "CpuShares": 0,
            "NanoCpus": 300000000,
            "CpuPeriod": 0,
            "CpuQuota": 0,
            "CpuRealtimePeriod": 0,
            "CpuRealtimeRuntime": 0,
            "CpusetCpus": "",
            "CpusetMems": "",
            "CpuCount": 0,
            "CpuPercent": 0,

但使用如下docker-compose.yml(v3版本,deploy配置):

version: '3'
services:
  aaa:
    image: progrium/stress
    command: -c 8 -t 20s
    deploy:
      resources:
        limits:
          memory: 100M
          cpus: '0.3'

执行docker-compose up -d启动后,docker stats显示CPU占用率远超限制:

CONTAINER ID   NAME                                               CPU %     MEM USAGE / LIMIT     MEM %     NET I/O           BLOCK I/O         PIDS
a94118f4a5f7   docker-aaa-1                                       87.74%    1.359MiB / 100MiB     1.36%     806B / 0B         1.91MB / 0B       9

docker inspect也未显示CPU限制:

$ docker inspect docker-aaa-1 | grep -i cpu
            "CpuShares": 0,
            "NanoCpus": 0,
            "CpuPeriod": 0,
            "CpuQuota": 0,
            "CpuRealtimePeriod": 0,
            "CpuRealtimeRuntime": 0,
            "CpusetCpus": "",
            "CpusetMems": "",
            "CpuCount": 0,
            "CpuPercent": 0,

我还尝试了v2版本的配置(直接使用cpus字段),结果同样无法生效:

version: '2'
services:
  aaa:
    image: progrium/stress
    command: -c 8 -t 20s
    cpus: 0.3

docker stats输出:

CONTAINER ID   NAME                                               CPU %     MEM USAGE / LIMIT     MEM %     NET I/O           BLOCK I/O         PIDS
8658bc78c795   docker-aaa-1                                       180.75%   1.367MiB / 3.805GiB   0.04%     1.18kB / 0B       0B / 0B           9

我的结论:

  • Docker引擎本身可以正常设置CPU限制
  • docker-compose能读取内存限制配置(stats中已显示)
  • docker-compose无法正确应用CPU限制配置

请问如何让docker-compose正确设置CPU限制?我遗漏了哪些配置或文档内容?

版本信息:

$ docker-compose -v
Docker Compose version v2.4.1
$ docker -v
Docker version 20.10.21, build baeda1f
$ uname -a
Linux hostname 5.10.0-18-amd64 #1 SMP Debian 5.10.140-1 (2022-09-02) x86_64 GNU/Linux
$ lsb_release -a
No LSB modules are available.
Distributor ID: Debian
Description:    Debian GNU/Linux 11 (bullseye)
Release:        11
Codename:       bullseye

解决方案

1. 修正v3版本配置(非Swarm模式)

deploy.resources配置仅适用于Docker Swarm集群模式,单机使用docker-compose up时,需要将resources放在服务的顶级配置下,而非deploy内部:

version: '3'
services:
  aaa:
    image: progrium/stress
    command: -c 8 -t 20s
    resources:
      limits:
        cpus: '0.3'
        memory: 100M

2. 验证配置生效

启动容器后,执行docker inspect <container-name> | grep -i nano,若能看到"NanoCpus": 300000000则说明CPU限制已正确设置。

3. 排查兼容性问题

若仍未生效,可检查:

  • 系统cgroup版本:Docker 20.10对cgroup v2的支持存在部分兼容性问题,可临时切换为cgroup v1测试
  • Docker守护进程配置:确保未启用干扰资源限制的参数

内容的提问来源于stack exchange,提问作者wufp

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.15 02:40:40