Docker安装后无法启动,并显示“环回附加失败”

Kat*_*oak 8 centos docker centos7

我已经按照以下说明从存储库安装了docker-ce:

https://docs.docker.com/install/linux/docker-ce/centos/

我收到尝试启动docker的错误消息:

docker.service的作业失败,因为控制进程退出并显示错误代码。有关详细信息,请参见“ systemctl status docker.service”和“ journalctl -xe”。

journalctl具有以下内容:

...
dockerd[3647]: time="2018-02-05T14:47:05-08:00" level=info msg="containerd successfully booted in 0.002946s" module=containerd
dockerd[3647]: time="2018-02-05T14:47:05.456552594-08:00" level=error msg="There are no more loopback devices available."
dockerd[3647]: time="2018-02-05T14:47:05.456585240-08:00" level=error msg="[graphdriver] prior storage driver devicemapper failed: loopback attach failed"
dockerd[3647]: Error starting daemon: error initializing graphdriver: loopback attach failed
systemd[1]: docker.service: main process exited, code=exited, status=1/FAILURE
systemd[1]: Failed to start Docker Application Container Engine.
Run Code Online (Sandbox Code Playgroud)

我看过关于使用环回设备以外的东西的文章,但据我所知,这些文章表明需要进行优化-并不意味着初次启动会失败。

CentOS Linux版本7.4.1708(核心)

rub*_*o77 0

我在同一 Debian XEN 4.8 主机上的 Debian 9 VM 中遇到同样的问题,在 Debian 8 VM 中也遇到同样的问题。

环回似乎不存在:

# losetup -f
losetup: cannot find an unused loop device: No such device
Run Code Online (Sandbox Code Playgroud)

您可以使用以下命令创建那些

#!/bin/bash
ensure_loop(){
  num="$1"
  dev="/dev/loop$num"
  if test -b "$dev"; then
    echo "$dev is a usable loop device."
    return 0
  fi
  echo "Attempting to create $dev for docker ..."
  if ! mknod -m660 $dev b 7 $num; then
    echo "Failed to create $dev!" 1>&2
    return 3
  fi
  return 0
}
ensure_loop 0
ensure_loop 0
Run Code Online (Sandbox Code Playgroud)

但这只是找到正确解决方案的提示,它并没有完全解决它,现在既然/dev/loop0存在,我就有错误:

Error opening loopback device: open /dev/loop0: no such device or address
[graphdriver] prior storage driver devicemapper failed: loopback attach failed
Run Code Online (Sandbox Code Playgroud)

更新:

我按照最新文档apt-get install docker-ce docker-ce-cli containerd.io中的描述安装,现在使用最新版本:

$ docker --version
Docker version 19.03.0, build aeac9490dc
Run Code Online (Sandbox Code Playgroud)

还是同样的问题:

failed to start daemon: error initializing graphdriver: loopback attach failed
Run Code Online (Sandbox Code Playgroud)

这是完整的日志:

level=info msg="Starting up"
level=warning msg="failed to rename /var/lib/docker/tmp for background deletion: rename /var/lib/docker/tmp 
/var/lib/docker/tmp-old: file exists. Deleting synchronously"
level=info msg="parsed scheme: \"unix\"" module=grpc
level=info msg="scheme \"unix\" not registered, fallback to default scheme" module=grpc
level=info msg="ccResolverWrapper: sending update to cc: {[{unix:///run/containerd/containerd.sock 0  <nil>}
] }" module=grpc
level=info msg="ClientConn switching balancer to \"pick_first\"" module=grpc
level=info msg="pickfirstBalancer: HandleSubConnStateChange: 0xc0005e8660, CONNECTING" module=grpc
level=info msg="pickfirstBalancer: HandleSubConnStateChange: 0xc0005e8660, READY" module=grpc
level=info msg="parsed scheme: \"unix\"" module=grpc
level=info msg="scheme \"unix\" not registered, fallback to default scheme" module=grpc
level=info msg="ccResolverWrapper: sending update to cc: {[{unix:///run/containerd/containerd.sock 0  <nil>}
] }" module=grpc
level=info msg="ClientConn switching balancer to \"pick_first\"" module=grpc
level=info msg="pickfirstBalancer: HandleSubConnStateChange: 0xc0007f5b10, CONNECTING" module=grpc
level=info msg="pickfirstBalancer: HandleSubConnStateChange: 0xc0007f5b10, READY" module=grpc
level=error msg="There are no more loopback devices available."
level=error msg="[graphdriver] prior storage driver devicemapper failed: loopback attach failed"
failed to start daemon: error initializing graphdriver: loopback attach failed
Run Code Online (Sandbox Code Playgroud)

更新2:

最后我发现,虚拟机中缺少 pygrub,这似乎是某个版本以来的新依赖项。

这个答案是一条死胡同,我添加了另一个答案,但我将其留在这里供其他有不同问题的用户获取一些提示。