dockerd: failed to start daemon: Devices cgroup isn‘t mounted

在部署项目到测试服务器时遇到Docker启动报错,错误信息提示Devices cgroup未挂载。通过查看服务状态和日志,发现与cgroup和Docker相关的问题。上午的操作如umount-a && mount-a以及修改/etc/fstab可能导致了Docker异常。为解决此问题,可以尝试重启服务器或者使用提供的脚本来检查和挂载cgroup。问题最终通过重启服务器得到解决,DockerOverlay驱动恢复正常。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

image.png

问题复现

有个项目在往测试服务器发布时报错了,

[root@Container 001.docker-project]# docker container run -d --volume /etc/localtime:/etc/localtime:ro --restart always --user root --name FZ_CaseCenter_Web --hostname FZ_CaseCenter_Web -p 8004:80 hub.nercoa.com/case-center/web:v1.3.6
44bf499c7f8b948f9705024406c00cb46c151eb7134e45e2bc5b361e3b8d5d62
docker: Error response from daemon: OCI runtime create failed: container_linux.go:380: starting container process caused: process_linux.go:385: applying cgroup configuration for process caused: mountpoint for devices not found: unknown.

applying cgroup configuration for process caused: mountpoint for devices not found: unknown.

问题分析

  • 查看服务运行状态及信息
[root@Container 001.docker-project]# systemctl restart docker
Job for docker.service failed because the control process exited with error code. See "systemctl status docker.service" and "journalctl -xe" for details.
[root@Container 001.docker-project]# journalctl -xe
-- Defined-By: systemd
-- Support: http://lists.freedesktop.org/mailman/listinfo/systemd-devel
-- 
-- Unit docker.service has finished shutting down.
Aug 24 13:45:28 Container systemd[1]: Starting Docker Application Container Engine...
-- Subject: Unit docker.service has begun start-up
-- Defined-By: systemd
-- Support: http://lists.freedesktop.org/mailman/listinfo/systemd-devel
-- 
-- Unit docker.service has begun starting up.
Aug 24 13:45:28 Container dockerd[52230]: time="2021-08-24T13:45:28.227759932+08:00" level=info msg="Starting up"
Aug 24 13:45:28 Container dockerd[52230]: time="2021-08-24T13:45:28.228470643+08:00" level=warning msg="insecure registry http://harbor.nercoa.com should not contain 'http:
Aug 24 13:45:28 Container dockerd[52230]: time="2021-08-24T13:45:28.229599674+08:00" level=info msg="parsed scheme: \"unix\"" module=grpc
Aug 24 13:45:28 Container dockerd[52230]: time="2021-08-24T13:45:28.229632777+08:00" level=info msg="scheme \"unix\" not registered, fallback to default scheme" module=grpc
Aug 24 13:45:28 Container dockerd[52230]: time="2021-08-24T13:45:28.229678411+08:00" level=info msg="ccResolverWrapper: sending update to cc: {[{unix:///run/containerd/cont
Aug 24 13:45:28 Container dockerd[52230]: time="2021-08-24T13:45:28.229707725+08:00" level=info msg="ClientConn switching balancer to \"pick_first\"" module=grpc
Aug 24 13:45:28 Container dockerd[52230]: time="2021-08-24T13:45:28.231722114+08:00" level=info msg="parsed scheme: \"unix\"" module=grpc
Aug 24 13:45:28 Container dockerd[52230]: time="2021-08-24T13:45:28.231776964+08:00" level=info msg="scheme \"unix\" not registered, fallback to default scheme" module=grpc
Aug 24 13:45:28 Container dockerd[52230]: time="2021-08-24T13:45:28.231825087+08:00" level=info msg="ccResolverWrapper: sending update to cc: {[{unix:///run/containerd/cont
Aug 24 13:45:28 Container dockerd[52230]: time="2021-08-24T13:45:28.231883312+08:00" level=info msg="ClientConn switching balancer to \"pick_first\"" module=grpc
Aug 24 13:45:28 Container dockerd[52230]: time="2021-08-24T13:45:28.251139635+08:00" level=info msg="[graphdriver] using prior storage driver: overlay2"
Aug 24 13:45:28 Container dockerd[52230]: time="2021-08-24T13:45:28.453402896+08:00" level=warning msg="Your kernel does not support cgroup memory limit"
Aug 24 13:45:28 Container dockerd[52230]: time="2021-08-24T13:45:28.453457019+08:00" level=warning msg="Unable to find cpu cgroup in mounts"
Aug 24 13:45:28 Container dockerd[52230]: time="2021-08-24T13:45:28.453472712+08:00" level=warning msg="Unable to find blkio cgroup in mounts"
Aug 24 13:45:28 Container dockerd[52230]: time="2021-08-24T13:45:28.453485270+08:00" level=warning msg="Unable to find cpuset cgroup in mounts"
Aug 24 13:45:28 Container dockerd[52230]: time="2021-08-24T13:45:28.453498322+08:00" level=warning msg="Unable to find pids cgroup in mounts"
Aug 24 13:45:28 Container dockerd[52230]: failed to start daemon: Devices cgroup isn't mounted   **### 注意这条错误信息**
Aug 24 13:45:28 Container systemd[1]: docker.service: main process exited, code=exited, status=1/FAILURE
Aug 24 13:45:28 Container systemd[1]: Failed to start Docker Application Container Engine.
-- Subject: Unit docker.service has failed
-- Defined-By: systemd
-- Support: http://lists.freedesktop.org/mailman/listinfo/systemd-devel
-- 
-- Unit docker.service has failed.
-- 
-- The result is failed.
Aug 24 13:45:28 Container systemd[1]: Unit docker.service entered failed state.
Aug 24 13:45:28 Container systemd[1]: docker.service failed.
lines 1809-1846/1846 (END)

1629787371.png

看到有一条错误信息为Aug 24 13:45:28 Container dockerd[52230]: failed to start daemon: Devices cgroup isn't mounted

  • 查看存储挂载情况

1629787416.png

cgroup已经是挂载状态了,但是Docker Overlay没有挂载上。

由于上午操作过umount -a && mount -a命令及修改过/etc/fstab文件,应该是个操作导致的Docker异常。

问题解决

由于是测试服务器,我直接重启了服务器即处理完成了。1629787373.png

可以看到Docker Overlay驱动都工作正常了。。

网上也找到一篇文章使用脚本处理

注释:
set -e : 在脚本的前面加上这条命令,表示如果任何语句的执行结果不是true则应该退出。
如果要增加可读性,可以使用set -o errexit,它的作用与set -e相同。
-e 表示文件存在
moutpoint: 判断指定的目录是否是挂载点

set -e   
# 这句是告诉bash如何有任何语句执行结果不为ture,就应该退出。 

if grep -v '^#' /etc/fstab | grep -q cgroup; then
	echo 'cgroups mounted from fstab, not mounting /sys/fs/cgroup'
	exit 0
fi

# kernel provides cgroups?
if [ ! -e /proc/cgroups ]; then
	exit 0
fi

# 确保目录存在
if [ ! -d /sys/fs/cgroup ]; then
	exit 0
fi

# mount /sys/fs/cgroup if not already done
if ! mountpoint -q /sys/fs/cgroup; then
	mount -t tmpfs -o uid=0,gid=0,mode=0755 cgroup /sys/fs/cgroup
fi

cd /sys/fs/cgroup

# get/mount list of enabled cgroup controllers
for sys in $(awk '!/^#/ { if ($4 == 1) print $1 }' /proc/cgroups); do
	mkdir -p $sys
	if ! mountpoint -q $sys; then
		if ! mount -n -t cgroup -o $sys cgroup $sys; then
			rmdir $sys || true
		fi
	fi
done


exit 0

问题总结

由于我这个问题出现的比较简单,我没有使用及测试上述脚本文件是否能解决此问题,但原博主说测试结果真实有效,可以直接复制脚本解决。

### 问题分析 Docker 守护进程启动失败的原因在于无法初始化网络控制器,具体表现为未能成功创建 NAT 链 `DOCKER`。此错误通常由以下几个方面引起: 1. **iptables 表不存在**:可能由于内核模块未加载或配置不正确导致 `nat` 表不可用[^1]。 2. **权限不足**:某些情况下,运行 Docker 的用户缺少必要的权限来操作防火墙规则[^2]。 3. **WSL2 或虚拟化环境中的兼容性问题**:在 WSL2 中使用 Debian 或其他 Linux 发行版时,可能会遇到类似的网络配置冲突。 --- ### 解决方案 #### 方法一:检查并加载必要内核模块 确保以下内核模块已加载: ```bash lsmod | grep -e br_netfilter -e nf_nat -e iptable_nat ``` 如果上述命令返回为空,则需手动加载这些模块: ```bash sudo modprobe br_netfilter sudo modprobe nf_nat sudo modprobe iptable_nat ``` 验证加载状态: ```bash lsmod | grep -e br_netfilter -e nf_nat -e iptable_nat ``` 若仍存在问题,可尝试永久启用这些模块,在 `/etc/modules-load.d/` 下新建文件(如 `docker-modules.conf`),并将以下内容写入其中: ```plaintext br_netfilter nf_nat iptable_nat ``` 重启系统以应用更改。 --- #### 方法二:调整 Docker 网络设置 编辑 Docker 的服务配置文件(通常是 `/etc/docker/daemon.json`)。如果没有该文件则可以创建它,并加入如下内容: ```json { "iptables": false, "ip-forward": true, "bridge": "none" } ``` 这一步的作用是禁用 Docker 自动管理的 `iptables` 规则,从而减少潜在冲突。 保存后重新加载 Docker 配置和服务: ```bash sudo systemctl daemon-reload sudo systemctl restart docker ``` 查看日志确认是否正常启动: ```bash journalctl -u docker.service ``` --- #### 方法三:排查 WSL2 特定问题 对于基于 WSL2 的环境,可能存在 Hyper-V 虚拟交换机与 Docker 网络桥接器之间的冲突。可以通过以下方式修复: 1. 更新 WSL 和相关组件至最新版本: ```bash wsl --update ``` 2. 删除现有的 Docker 数据目录并重置其存储驱动程序: ```bash sudo service docker stop rm -rf /var/lib/docker/ sudo dockerd --storage-driver=overlay2 & ``` 3. 如果仍然存在 NAT 创建失败的情况,考虑切换到静态 IP 地址分配模式。修改 WSL2 的网络适配器属性,或者通过 PowerShell 执行以下脚本强制指定子网范围: ```powershell wsl --shutdown New-NetIPAddress -IPAddress 192.168.x.y -PrefixLength 24 -InterfaceIndex $(Get-NetAdapter | Where-Object {$_.Name -like "*vEthernet (WSL)*"}).ifIndex ``` 最后再次测试 Docker 是否能够顺利启动。 --- ### 总结 以上方法涵盖了从基础层面(内核模块)到高级场景(WSL2 环境优化)的不同解决方案。实际执行过程中应优先按照顺序逐一排除可能性,直至找到根本原因并解决问题。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

WinJayX

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值