核心目标是让容器归属已有带策略的父cgroup以继承CPU/内存限制;需先查cgroup版本(cat /proc/sys/fs/cgroup/version)和Docker驱动(docker info | grep "Cgroup Driver"),v2+systemd推荐用slice,v1+cgroupfs需手动管理路径。

在 Docker 中配置 cgroup-parent(即容器的 cgroup 父级路径),核心目标是让容器不使用默认的 docker 自建 cgroup,而是归属到一个已有、带资源策略的父级 cgroup 下——从而继承其 CPU、内存等硬性限制。这不是给单个容器设限,而是实现租户级、服务级或系统级的统一资源管控。
确认宿主机 cgroup 版本和 Docker 驱动
行为差异极大,必须先查清:
- 运行
cat /proc/sys/fs/cgroup/version查看是 cgroup v1 还是 v2(输出1或2) - 运行
docker info | grep "Cgroup Driver"查看驱动是systemd还是cgroupfs
绝大多数现代发行版(如 Ubuntu 22.04+、CentOS 8+、Fedora)默认启用 cgroup v2 + systemd 驱动,此时推荐走 systemd slice 路径;若为 cgroup v1 + cgroupfs,则需手动管理路径。
用 systemd slice 统一管控(推荐方式)
适用于使用 systemd 的宿主机(几乎全部主流发行版)。slice 是持久化、可管理、天然支持层级 cgroup 的机制。
- 创建 slice 文件:
/etc/systemd/system/myapp.slice,内容示例:
[Slice] CPUQuota=150% MemoryMax=3G
- 启用并重载:
sudo systemctl daemon-reload && sudo systemctl start myapp.slice - 启动容器时绑定:
docker run -d --cgroup-parent=myapp.slice --name app nginx - 验证:进容器执行
cat /proc/1/cgroup,应看到路径含myapp.slice;宿主机上运行systemctl status myapp.slice可查看实时资源占用
手动指定自定义 cgroup 路径(cgroupfs 驱动场景)
仅当明确使用 cgroupfs 驱动,且需绕过 systemd 时采用。注意权限与路径规范:
- cgroup v2 下:
docker run --cgroup-parent=myparent→ 对应/sys/fs/cgroup/myparent/(不加前导斜杠) - cgroup v1 下:
docker run --cgroup-parent=/mygroup/prod→ 路径必须已存在,且由 root 创建、对 docker daemon 可写 - 手动设限示例(v2):
echo "150000 100000" | sudo tee /sys/fs/cgroup/myparent/cpu.max(表示 1.5 核)
⚠️ Docker 不会自动清理该父目录,退出后需手动 rmdir 或由上层工具管理生命周期。
在 docker-compose 中配置
要求 Compose 版本 ≥ 2.4(推荐 3.8+),且注意适用模式:
- 非 Swarm 模式(
docker-compose up):用顶级字段
services:
web:
image: nginx
cgroup_parent: myapp.slice
mem_limit: 2G
cpus: '1.0'
- Swarm 模式(
docker stack deploy):不支持cgroup_parent,deploy.resources无法替代该功能
若需 Swarm 场景下实现类似效果,应改用节点级 systemd slice + 容器部署在指定节点,并通过 placement.constraints 控制调度位置。











