使用docker --cgroup-parent指定cgroup报错(cgroups v2环境)
你的问题出在Docker与systemd cgroup驱动的适配规则上,结合cgroups v2的特性,具体错误点和修正方案如下:
核心错误原因
当Docker使用systemd作为cgroup驱动时(Ubuntu 18.04搭配Docker 20.10默认可能启用该驱动),--cgroup-parent参数要求传入systemd风格的slice单元名称(格式需为xxx.slice或父slice/子slice.slice),而非直接使用sysfs文件系统路径。同时你手动创建的cgroup目录名称不符合slice命名规则,且容器运行命令中指定的cgroup路径与实际创建的路径不匹配。
解决步骤
1. 确认Docker的cgroup驱动
先检查当前Docker使用的cgroup驱动类型:
docker info | grep "Cgroup Driver"
如果输出为Cgroup Driver: systemd,则必须遵循systemd的slice命名规则;如果是cgroupfs,则可直接使用sysfs路径(后续有切换驱动的方案)。
2. 正确创建符合要求的cgroup
方式一:用systemd命令自动创建(推荐)
无需手动操作sysfs,直接通过systemd命令创建带资源统计的slice:
systemd-run --unit=mygroup.slice --slice=mygroup.slice \ --property=CPUAccounting=true \ --property=MemoryAccounting=true \ --property=IOAccounting=true \ --property=PIDsAccounting=true \ /bin/true
这条命令会自动在/sys/fs/cgroup/system.slice/下生成mygroup.slice目录,并自动配置好所需的资源控制子系统。
方式二:手动操作sysfs创建
如果坚持手动创建,需将目录名改为.slice结尾以符合systemd规则:
mkdir /sys/fs/cgroup/system.slice/mygroup.slice cd /sys/fs/cgroup/system.slice/mygroup.slice echo +cpuset +cpu +io +memory +pids > cgroup.subtree_control
3. 正确运行Docker容器
指定--cgroup-parent时使用systemd的slice名称,而非sysfs路径:
docker run --cgroup-parent=system.slice/mygroup.slice \ -p 5201-5202:5201-5202 \ -v /root:/root \ -it \ --entrypoint "/bin/bash" \ docker-stress
额外适配方案:切换Docker到cgroupfs驱动
如果你更习惯直接使用sysfs路径作为cgroup parent,可以修改Docker配置切换到cgroupfs驱动:
- 编辑
/etc/docker/daemon.json(不存在则新建):
{ "exec-opts": ["native.cgroupdriver=cgroupfs"] }
- 重启Docker服务:
systemctl restart docker
- 此时可直接使用你最初创建的
mygroup目录路径运行容器:
docker run --cgroup-parent=/sys/fs/cgroup/system.slice/mygroup \ -p 5201-5202:5201-5202 \ -v /root:/root \ -it \ --entrypoint "/bin/bash" \ docker-stress
内容的提问来源于stack exchange,提问作者Will MacGregor

