Docker Compose 不原生支持直接配置 cgroups v2 参数(如 cpu.weight、memory.max),但可通过 deploy.resources(推荐)、runtime_opts(Docker 24.0+ 实验性)或挂载 host cgroup(不推荐)实现精细化控制。

在 Docker Compose 中直接配置 cgroups 参数(如 cpu.weight、memory.max 等 systemd-style 控制组 v2 原生参数)**不被原生支持**,因为 Compose 的 deploy.resources 和传统 mem_limit/cpus 字段最终映射的是 Docker Engine 的 OCI runtime 选项(即 cgroup v1/v2 的高层封装),而非任意 cgroup 控制器的底层键值。但你可以通过几种方式实现对服务的精细化 cgroups 资源控制:
使用 deploy.resources(推荐,兼容性好)
这是最标准、跨平台(Swarm / standalone)、且被 Compose 规范明确支持的方式,适用于 CPU、内存、PIDs 等常见配额:
-
CPU 配额(cfs_quota_us / cfs_period_us):用
cpus: 0.5或limits.cpu: "500m",底层会设置cfs_quota_us=50000+cfs_period_us=100000 -
内存限制与保障:用
limits.memory: "512M"(对应memory.max),配合reservations.memory: "256M"(影响memory.low,仅 cgroup v2 有效) -
PID 限制:Compose v2.23+ 支持
limits.pids: 100→ 映射为pids.max
通过 runtime_opts 传入低层 cgroup v2 参数(需 Docker 24.0+ & cgroup v2)
若你运行在较新内核(≥5.8)+ cgroup v2 模式 + Docker 24.0+,可利用 runtime_opts 直接写入 cgroup 属性(实验性,需启用 com.docker.compose.runtime_opts 标签或 CLI):
- 在
docker-compose.yml中为服务添加:labels:- "com.docker.compose.runtime_opts=cpu.weight=50 memory.high=268435456"
这会令容器启动时自动写入/sys/fs/cgroup/.../cpu.weight和memory.high - ⚠️ 注意:该功能依赖 Docker 引擎的实验特性支持,需确认
docker info | grep "Cgroup Version"输出为2,且未禁用runtime_opts
挂载 host cgroup fs 并手动配置(高级,不推荐常规使用)
仅用于调试或特殊场景(如运行 cgroup 工具 inside 容器):
- 将宿主机 cgroup v2 根目录以只读方式挂载进容器:
volumes:- "/sys/fs/cgroup:/sys/fs/cgroup:ro" - 然后在容器内用
echo 50 > /sys/fs/cgroup/xxx/cpu.weight手动调整(需容器有cap_add: [SYS_ADMIN],存在安全风险) - ❌ 不适用于生产编排 —— 违反不可变基础设施原则,且 Compose 无法声明式管理这类运行时变更
验证配置是否生效
容器启动后,进入容器或宿主机检查对应 cgroup 路径:
- 查容器 cgroup 路径:
cat /proc/1/cgroup→ 找到类似0::/docker/abc123...的路径 - 查 CPU 权重:
cat /sys/fs/cgroup/docker/abc123*/cpu.weight - 查内存上限:
cat /sys/fs/cgroup/docker/abc123*/memory.max - 注意:路径前缀可能是
/sys/fs/cgroup/system.slice/docker-xxx.scope/(systemd 环境下)

















