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
相关产品推荐
相关产品推荐

