关于docker-Engine使用的存储驱动devicemapper的常识

文章讲述了值班人员在处理PAAS节点docker-container创建失败的问题时,发现与devicemapper存储驱动有关。问题可能源于存储资源不足或元数据错误,通过停止并检查docker服务和devicemapper元数据来修复。同时指出docker-devicemapper已过时,应考虑升级到更稳定的overlay2驱动。

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

缘起:

今天值班的兄弟找我说PAAS节点扩容后有个 docker-container 创建一直失败,看不懂输出的报文信息。

看值班给出的投屏发现和storage-driver有关,提示信息如下:

Error running DeviceCreate (createSnapDevice) dm_task_run failed

查看了下

docker版本是 docker-Engine 20;

OS 的版本是 centos 6

Kernel的版本是 3.10

又查看了下 /etc/docker/daemon.json 发现storage-driver是devicemapper

再查看docker的log信息,发现有这样一条消息:

statusCode=500 Error running DeviceCreate (createSnapDevice) dm_task_run failed

唔,大概是docker链接的后端存储资源不足了。

因为 http 协议中 产生 500 状态码的一个可能性原因是服务端资源不足,再结合DeviceCreate任务失败,可以确认排查方向应该是 devicemapper驱动下的存储资源状态。

devicemapper本质上是Linux-Kernel级别的块设备存储驱动,依赖于LVM工具包支持。在逻辑卷管理中,除了LVM服务运行异常外,能够影响到数据写操作的就是存储空间和元数据两个item了。

执行 vgdisplay ,可以查看到回显信息说明 LVM服务运行无异常;

执行 dmsetup status 和 dmsetp info,可以查看到有充盈的存储空间;

好吧,看来是扩容完后有人在没有正常stop点docke

sudo 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@192 ~]# systemctl status dockerdocker.service - Docker Application Container Engine Loaded: loaded (/usr/lib/systemd/system/docker.service; enabled; vendor preset: disabled) Active: failed (Result: exit-code) since 三 2025-03-19 14:28:02 CST; 13s ago Docs: http://docs.docker.com Process: 3554 ExecStart=/usr/bin/dockerd-current --add-runtime docker-runc=/usr/libexec/docker/docker-runc-current --default-runtime=docker-runc --exec-opt native.cgroupdriver=systemd --userland-proxy-path=/usr/libexec/docker/docker-proxy-current --init-path=/usr/libexec/docker/docker-init-current --seccomp-profile=/etc/docker/seccomp.json $OPTIONS $DOCKER_STORAGE_OPTIONS $DOCKER_NETWORK_OPTIONS $ADD_REGISTRY $BLOCK_REGISTRY $INSECURE_REGISTRY $REGISTRIES (code=exited, status=1/FAILURE) Main PID: 3554 (code=exited, status=1/FAILURE) 3月 19 14:28:02 192.168.137.128 systemd[1]: Starting Docker Application Container..... 3月 19 14:28:02 192.168.137.128 dockerd-current[3554]: unable to configure the Doc...l 3月 19 14:28:02 192.168.137.128 systemd[1]: docker.service: main process exited, ...RE 3月 19 14:28:02 192.168.137.128 systemd[1]: Failed to start Docker Application Co...e. 3月 19 14:28:02 192.168.137.128 systemd[1]: Unit docker.service entered failed state. 3月 19 14:28:02 192.168.137.128 systemd[1]: docker.service failed. Hint: Some lines were ellipsized, use -l to show in full. [root@192 ~]# sudo vim /etc/docker/daemon.json [root@192 ~]# sudo systemctl daemon-reload [root@192 ~]# sudo 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@192 ~]# docker -v
最新发布
03-20
<think>好的,我现在需要解决Docker服务启动失败的问题。用户提到在启动Docker时遇到控制进程退出错误,错误代码显示,需要查看systemctl和journalctl的日志来排查原因。首先,我应该回想一下常见的Docker启动问题,并结合用户提供的引用内容来寻找可能的解决方案。 首先,根据引用[2],Docker启动报错可能与graphdriver初始化有关,这通常涉及存储驱动的问题。例如,如果Docker存储驱动配置不正确,或者存储目录损坏,可能会导致启动失败。这时候可能需要检查存储驱动的配置,或者清理相关的存储目录。 其次,引用[3]中提到的情况是虚拟机长时间未使用后启动Docker失败,这可能是因为系统更新或依赖项变化导致的。比如,Docker的某些依赖包可能被更新或删除,或者Docker的配置文件在系统更新后不兼容。这时候需要检查Docker的依赖项是否满足,或者尝试重新安装Docker。 另外,引用[1]提到重启Docker守护进程可以解决问题,但用户已经尝试过重启,显然问题依然存在,所以需要更深入的排查步骤。 接下来,我应该按照步骤指导用户逐步排查问题。首先,检查Docker服务的状态,使用systemctl status docker.service命令获取详细信息。然后查看日志,使用journalctl -xe或journalctl -u docker.service来查看详细的错误日志。根据日志中的具体错误信息,可能的问题包括存储驱动错误、权限问题、配置文件错误、端口冲突等。 可能的解决步骤包括: 1. 检查存储驱动配置,比如在/etc/docker/daemon.json中是否正确配置了存储驱动,或者尝试更换为aufs、devicemapper等。 2. 清理Docker存储目录,如/var/lib/docker,但需要注意这会导致数据丢失,需要提前备份。 3. 检查系统内核是否支持当前的存储驱动,比如overlay2需要内核版本4.0以上。 4. 检查是否有端口冲突,特别是如果Docker配置了特定的网络设置或代理,可能需要调整。 5. 重新安装Docker,确保所有依赖项正确安装,并且配置文件没有损坏。 6. 检查SELinux或AppArmor等安全模块是否阻止了Docker的正常启动,尝试临时禁用它们以测试。 7. 确保Docker所需的cgroup配置正确,特别是如果系统使用了systemd或其他初始化系统。 在生成相关问题的时候,需要考虑用户可能进一步遇到的类似问题,例如其他存储驱动错误、日志分析方法、依赖项检查等。 最后,确保回答结构清晰,步骤明确,并且引用了提供的参考资料中的信息,如重启Docker守护进程、存储驱动初始化错误等。同时,提醒用户在操作前备份数据,避免数据丢失。</think>### Docker服务启动失败的控制进程错误解决方案 当Docker服务启动失败并显示`control process exited with error code`时,可以按以下步骤排查和修复: --- #### **步骤1:查看服务状态与日志** 1. 使用命令查看服务状态: ```bash systemctl status docker.service ``` 输出中会显示失败原因(如依赖项缺失、配置错误等)[^3]。 2. 查看详细日志: ```bash journalctl -xe -u docker.service ``` 重点关注日志末尾的报错关键词(如`graphdriver`、`permission denied`等)[^2]。 --- #### **步骤2:常见错误与修复** 1. **存储驱动初始化失败(如`error initializing graphdriver`)** - 检查`/etc/docker/daemon.json`中的存储驱动配置: ```json { "storage-driver": "overlay2" } ``` - 清理旧存储数据(**谨慎操作,会删除容器和镜像**): ```bash rm -rf /var/lib/docker systemctl restart docker ``` [^2] 2. **文件系统或权限问题** - 确保`/var/run/docker.sock`权限正确: ```bash chmod 666 /var/run/docker.sock ``` - 检查SELinux/AppArmor是否阻止启动,临时禁用测试: ```bash setenforce 0 # 临时关闭SELinux systemctl restart docker ``` 3. **依赖项缺失或冲突** - 重新安装Docker并更新依赖: ```bash yum remove docker* && yum install docker # CentOS apt-get purge docker* && apt-get install docker # Ubuntu ``` - 检查内核版本是否兼容(需≥3.10): ```bash uname -r ``` 4. **端口或网络冲突** - 检查Docker配置文件中的端口设置(如`/etc/docker/daemon.json`)是否与其他服务冲突。 --- #### **步骤3:验证修复** 重启Docker服务并验证: ```bash systemctl daemon-reload systemctl start docker docker ps # 确认服务正常 ``` ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值