问题描述
在启动 Docker 容器时遇到以下错误:
Error response from daemon: failed to create task for container: failed to create shim task: OCI runtime create failed: runc create failed: mountpoint for devices not found: unknown查看 Docker 服务日志发现:
failed to start daemon: Devices cgroup isn't mounted问题分析
- 错误类型:
Devices cgroup isn't mounted - 根本原因:Linux 系统中设备控制组(devices cgroup)没有正确挂载
- 影响范围:Docker 无法正常启动和运行容器
- 技术原理:Docker 依赖 cgroup 来管理容器的设备访问权限
解决方案
1. 检查当前 cgroup 挂载状态
# 检查当前系统中 cgroup 的挂载情况
mount | grep cgroup
# 查看 cgroup 文件系统目录
ls -la /sys/fs/cgroup/2. 手动挂载 devices cgroup
# 创建 devices cgroup 挂载点
sudo mkdir -p /sys/fs/cgroup/devices
# 手动挂载 devices cgroup
sudo mount -t cgroup -o devices none /sys/fs/cgroup/devices3. 配置系统启动时自动挂载
编辑 /etc/fstab 文件,确保系统重启后能自动挂载:
# 编辑 fstab 文件
sudo vim /etc/fstab添加以下行到 /etc/fstab:
cgroup /sys/fs/cgroup/devices cgroup devices 0 04. 检查并配置 GRUB 引导参数
确认内核启动参数中包含 cgroup 支持:
# 查看当前内核启动参数
cat /proc/cmdline如缺少相关参数,编辑 /etc/default/grub:
# 编辑 GRUB 配置文件
sudo vim /etc/default/grub在 GRUB_CMDLINE_LINUX 中添加 cgroup 相关参数:
GRUB_CMDLINE_LINUX="cgroup_enable=devices cgroup_memory=1"更新 GRUB 配置:
# 更新 GRUB 配置(Ubuntu/Debian)
sudo update-grub
# 或者对于 CentOS/RHEL
sudo grub2-mkconfig -o /boot/grub2/grub.cfg5. 重启并验证修复
# 重启 Docker 服务
sudo systemctl restart docker
# 检查 Docker 服务状态
sudo systemctl status docker
# 验证容器是否能正常启动
docker run hello-world预防措施
1. 定期检查系统配置
# 创建检查脚本
#!/bin/bash
if [ ! -d "/sys/fs/cgroup/devices" ] || [ -z "$(mount | grep 'cgroup.*devices')" ]; then
echo "Devices cgroup not mounted"
exit 1
else
echo "Devices cgroup properly mounted"
fi2. 系统监控配置
- 监控 Docker 服务状态
- 定期检查 cgroup 挂载情况
- 设置自动告警机制
总结
这个问题主要出现在系统配置不当或内核参数设置不完整的情况下。通过正确配置 cgroup 挂载可以解决 Docker 容器运行时的设备访问问题。建议在生产环境中确保系统配置的完整性,避免类似问题的出现。