如何在CentOS 7 LXC容器中运行Docker?遇Cgroup路径不存在报错
解决LXC嵌套CentOS 7容器内运行Docker的Cgroup路径不存在问题
我之前碰到过完全一样的情况——在DigitalOcean的CentOS 7 Droplet上用源码编译的LXD搭嵌套容器,想在里面跑Docker部署K8s,结果就报了这个cgroup路径不存在的错误,而Ubuntu下却完全没问题。其实核心问题就是CentOS 7和Ubuntu的cgroup驱动、LXC默认配置差异导致的,下面是我亲测有效的解决步骤:
一、先调整LXC容器的核心配置
首先停止出问题的容器(假设你的容器名叫docker-test):
lxc stop docker-test
然后通过LXD的配置命令,给容器加上必要的权限和cgroup挂载规则:
# 保留你之前设置的特权和嵌套模式 lxc config set docker-test security.privileged true lxc config set docker-test security.nesting true # 加载Docker需要的内核模块 lxc config set docker-test linux.kernel_modules "overlay,br_netfilter" # 关键配置:让容器正确挂载cgroup并拥有读写权限 lxc config set docker-test raw.lxc "lxc.cgroup.devices.allow = a lxc.mount.auto = cgroup:rw lxc.cgroup2.mount = 1"
注:如果你的宿主机CentOS 7内核版本较低(比如低于4.15)不支持cgroup v2,把
lxc.cgroup2.mount = 1换成lxc.cgroup.mount = 1即可。
二、在CentOS 7容器内调整Docker的cgroup驱动
启动容器并进入:
lxc start docker-test && lxc exec docker-test bash
接下来配置Docker使用和CentOS 7一致的systemd cgroup驱动:
- 创建/编辑Docker守护进程配置文件
/etc/docker/daemon.json:
{ "exec-opts": ["native.cgroupdriver=systemd"], "storage-driver": "overlay2" }
- 重启Docker服务生效:
systemctl daemon-reload systemctl restart docker
三、验证并修复cgroup挂载(可选)
如果重启后还是有问题,先检查容器内的cgroup挂载情况:
mount | grep cgroup
如果看不到/sys/fs/cgroup/systemd的挂载项,手动执行以下命令临时挂载:
mkdir -p /sys/fs/cgroup/systemd mount -t cgroup -o none,name=systemd cgroup /sys/fs/cgroup/systemd
不过只要你正确配置了LXC的raw.lxc参数,这个挂载应该会自动完成。
四、测试Docker运行
现在跑hello-world验证:
docker run hello-world
如果成功输出,说明问题已经解决了!
额外:K8s部署前的准备
既然你的最终目标是部署K8s节点,还要在容器内开启必要的网络参数:
echo "net.bridge.bridge-nf-call-iptables=1" >> /etc/sysctl.conf echo "net.ipv4.ip_forward=1" >> /etc/sysctl.conf sysctl -p
我之前用这套配置在DigitalOcean上搭建了3个CentOS 7嵌套容器,分别作为K8s的master和两个worker节点,Docker和K8s集群都运行得很稳定。
内容的提问来源于stack exchange,提问作者Hcabnettek
相关产品推荐
相关产品推荐

