docker服务启动失败常见问题汇总

场景1: 报错Non existing device xxx-thinpool和Unable to take ownership of thin-pool

问题背景

docker配置thinpool存储驱动启动服务。

现象描述

执行systemctl restart docker发现如下报错:

thinpool

原因分析

这种通常是thinpool损坏导致的,需要进行thinpool的恢复和重建。

解决方案

可参考如下步骤对thinpool进行重建流程:

  1. 对于防止systemctl重启导致的恢复异常重建之前应将其关闭。

    bash
    mv /usr/lib/systemd/system/docker.service /usr/lib/systemd/system/docker.service_bak
  2. 删除/var/lib/docker目录下除hooks文件夹之外的所有文件。

    bash
    cd /var/lib/docker/
    rm -rf !(hooks)
  3. 执行重建thinpool的操作。

    bash
    lvremove /dev/docker/thinpool
    lvcreate --wipesignatures y -n thinpool docker -L 19g(95%VG)
    lvcreate --wipesignatures y -n thinpoolmeta docker -L 0.2g(1%VG)
    lvconvert -y --zero n -c 512K --thinpool docker/thinpool --poolmetadata docker/thinpoolmeta
    lvchange --metadataprofile docker-thinpool docker/thinpool
  4. 打开之前操作的docker重拉。

    bash
    mv /usr/lib/systemd/system/docker.service_bak /usr/lib/systemd/system/docker.service
    systemctl enable docker.service
  5. 重启docker。

    bash
    systemctl start docker

systemctl status docker 结果中查看docker是否running。

场景2:systemd报错timeout

问题背景

正常启动docker.service服务。

现象描述

启动超时,导致dockerd服务启动失败:

image

原因分析

通常是docker服务启动时间太长,导致systemd拉起服务超时90s。

解决方案

这种情况一般是docker服务启动的时候需要清理的内容太多,可能的原因有容器数量太多或者环境cpu压力较大,建议拉长超时时间重试。

  1. 在/usr/lib/systemd/system/docker.service的[Service]添加TimeoutSec=0

  2. 重启docker服务systemctl restart docker。

场景3:报错unable to configure the Docker daemon with file /etc/docker/daemon.json和unable to configure the Docker daemon with file /etc/sysconfig/docker

问题背景

修改docker daemon.json配置文件后重新启动docker服务。

现象描述

dockerd服务启动失败: image

原因分析及解决方案

一般是配置文件有问题,具体到报错中提示的文件中定位,找到错误的配置并修改即可。

场景4:systemctl status docker不打印日志,但是启动不了

问题背景

执行systemctl status docker命令查看docker服务日志。

现象描述

docker服务不打印日志,且启动失败:

image

原因分析及解决方案

原因1

一般出现于日志服务有问题的情况。

解决方案

  1. 检查rsyslog服务是否正常运行。

  2. 如果没有运行的话可以先重启日志服务。

  3. 根据docker服务启动的报错日志进行下一步定位。

原因2

/run被占满,docker出现过日志打印占满/run目录的问题。

解决方案

  1. 进入/var/run/docker/containerd/daemon/io.containerd.runtime.v1.linux/moby/目录,执行du -sh *找到空间占用较大的目录
  2. 进入步骤1中找到的目录,执行echo "" > log.json清空该异常日志文件,注意不能删除该文件,删除会导致容器运行异常。

场景5:dockerd链接/var/run/containerd/containerd.sock失败

问题背景

启动docker.service服务。

现象描述

docker服务启动失败并报错:

image

原因分析

该场景常见于在/var/run/containerd目录下存在非法的containerd.sock文件,比如该文件为一个失效的软链接的情况。

解决方案

删除错误文件并重启dockerd即可恢复。

场景6:创建/var/run/docker目录失败导致服务启动失败

问题背景

启动docker服务。

现象描述

服务启动失败并报错:

image

原因分析

常见于/var/run目录有问题的情况,比如软链接失效。

解决方案

使用ln命令重建软链接,重启docker服务恢复。

场景7:docker服务初始化,报错no space left

问题背景

启动docker服务。

现象描述

docker服务启动失败并报错:

image

原因分析

常见于给docker预留的存储空间被占满的情况:

image

解决方案

重新预分配,将给docker的存储空间增大。

场景8:containerd、containerd-shim、runc二进制权限不对导致docker服务无法启动

问题背景

启动docker服务。

现象描述

docker服务启动失败并报错:

image

原因分析及解决方案

从报错来看是找不到runc二进制,实际上是可执行权限被去掉导致的,修改为原本的的权限之后恢复。

更多常见相关问题可在后续继续补充。