docker 中 cgroupparent 用于指定容器 cgroup 的父路径,实现资源隔离与 systemd 集成;需先确认 cgroup 版本(v1/v2)和驱动(systemd/cgroupfs),systemd 驱动下设 slice 名(如 myapp.slice),cgroupfs 驱动下需提供已存在的完整路径(v1)或无前缀名称(v2);docker-compose 中通过 cgroup_parent 字段配置(≥2.4),配合 systemd slice 可统一管控 cpu、内存等资源。

在 Docker 中配置容器的 cgroupParent,本质是让容器的 cgroup 被创建在指定的父级 cgroup 路径下,从而实现更精细的资源隔离或与宿主机已有 cgroup 层级(如 systemd slice、自定义资源组)对齐。这在混合部署、资源分级管控或与 systemd 集成时非常有用。
确认宿主机 cgroup 版本和驱动
Docker 的 cgroupParent 行为取决于底层 cgroup 版本(v1 或 v2)以及 Docker 使用的 cgroup 驱动(systemd 或 cgroupfs)。必须先确认:
- 运行
cat /proc/sys/fs/cgroup/version查看 cgroup 版本(1 或 2) - 运行
docker info | grep "Cgroup Driver"查看当前驱动 - 若使用
systemd驱动(推荐且默认),cgroupParent应设为有效的 systemd slice 名(如myapp.slice),Docker 会自动映射为 cgroup 路径 - 若使用
cgroupfs驱动,则需提供完整路径(如/mygroup/production),且该路径必须已由管理员提前创建并可写
通过 docker run 指定 cgroupParent
启动单个容器时,用 --cgroup-parent 参数指定:
- systemd 驱动示例:
docker run --cgroup-parent=myapp.slice nginx→ 容器 cgroup 将位于/sys/fs/cgroup/myapp.slice/docker-xxx.scope/ - cgroupfs 示例(v1):
docker run --cgroup-parent=/mygroup/production nginx→ 要求/mygroup/production已存在且权限正确 - cgroupfs + v2 示例(路径格式不同):
docker run --cgroup-parent=parentname→ 实际对应/sys/fs/cgroup/parentname/,无需前导斜杠
在 docker-compose.yml 中配置
适用于编排场景,写法简洁但要求版本 ≥ 2.4(推荐用 3.8+):
services:
app:
image: nginx
cgroup_parent: myapp.slice # systemd 风格
# 或 cgroup_parent: /mygroup/staging # cgroupfs 风格
注意:Compose 不校验父 cgroup 是否真实存在,错误路径会导致容器启动失败并报 invalid cgroup parent 类错误。
配合 systemd slice 做资源限制(推荐实践)
利用 systemd 管理 cgroup 更可靠。例如创建一个带 CPU 和内存限制的 slice:
- 新建
/etc/systemd/system/myapp.slice:
[Unit] Description=MyApp Slice Before=slices.target <p>[Slice] CPUQuota=50% MemoryMax=512M </p>
- 执行
sudo systemctl daemon-reload && sudo systemctl start myapp.slice - 再启动容器:
docker run --cgroup-parent=myapp.slice nginx - 容器将继承该 slice 的所有资源策略,且可通过
systemctl status myapp.slice统一监控











