问题描述

在启动 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/devices


3. 配置系统启动时自动挂载

编辑 /etc/fstab 文件,确保系统重启后能自动挂载:

# 编辑 fstab 文件
sudo vim /etc/fstab


添加以下行到 /etc/fstab

cgroup /sys/fs/cgroup/devices cgroup devices 0 0


4. 检查并配置 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.cfg


5. 重启并验证修复

# 重启 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"
fi


2. 系统监控配置

  • 监控 Docker 服务状态
  • 定期检查 cgroup 挂载情况
  • 设置自动告警机制

总结

这个问题主要出现在系统配置不当或内核参数设置不完整的情况下。通过正确配置 cgroup 挂载可以解决 Docker 容器运行时的设备访问问题。建议在生产环境中确保系统配置的完整性,避免类似问题的出现。