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

Posted

技术标签:

【中文标题】安装后 Docker 无法启动,并显示“环回附加失败”【英文标题】:Docker fails to start after install with "loopback attach failed" 【发布时间】:2018-07-15 22:29:49 【问题描述】:

我已经按照以下说明从存储库安装了 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.

我看过有关使用环回设备以外的其他设备的文章,但据我所知,这些文章表明要进行优化 - 并不意味着初始启动应该失败。

CentOS Linux 版本 7.4.1708(核心)

【问题讨论】:

centos7 上同样的问题 你解决了吗?我在我的 debian XEN 服务器上的虚拟机中遇到了同样的问题 看起来像一个错误。你在 Docker 项目上提交过问题吗? github.com/docker/for-linux 【参考方案1】:

如果您在 Xen 上的 VM 中运行 Linux,则需要安装内核并使用 pygrub(请参阅https://wiki.debian.org/PyGrub)并更新到 docker 版本 19.03.0。

安装 pygrub

1。在你的虚拟机中执行:

mkdir /boot/grub
apt-get install -y linux-image-amd64
cat > /boot/grub/menu.lst << EOF

default         0
timeout         2

title           Debian GNU/Linux
root            (hd0,0)
kernel          /vmlinuz root=/dev/xvda2 ro
initrd          /initrd.img

title           Debian GNU/Linux (recovery mode)
root            (hd0,0)
kernel          /vmlinuz root=/dev/xvda2 ro single
initrd          /initrd.img

EOF

2。停止你的虚拟机,例如:

xen destroy vm01

3。编辑你的 xen 配置

例如,对于您的 DOM0 中的 VM /etc/xen/vm01.cfg(注释掉前两行并添加最后三行):

#kernel      = '/boot/vmlinuz-4.9.0-9-amd64'
#ramdisk     = '/boot/initrd.img-4.9.0-9-amd64'
extra       = 'elevator=noop'
bootloader  = '/usr/lib/xen-4.8/bin/pygrub'
bootloader_args = [ '--kernel=/vmlinuz', '--ramdisk=/initrd.img', ]

4。启动你的虚拟机:

xen create /etc/xen/vm01.cfg

【讨论】:

【参考方案2】:

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

环回似乎不存在:

# losetup -f
losetup: cannot find an unused loop device: No such device

你可以用

#!/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

但这只是寻找正确解决方案的提示,并没有完全解决,现在由于/dev/loop0存在,我有错误:

Error opening loopback device: open /dev/loop0: no such device or address
[graphdriver] prior storage driver devicemapper failed: loopback attach failed

更新:

我按照latest docs 中的说明安装了apt-get install docker-ce docker-ce-cli containerd.io,现在安装了最新版本:

$ docker --version
Docker version 19.03.0, build aeac9490dc

还是同样的问题:

failed to start daemon: error initializing graphdriver: loopback attach failed

这是完整的日志:

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

更新 2:

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

这个答案是一条死胡同,我添加了另一个答案,但我把这个留给其他用户,他们有不同的问题来获得一些提示。

【讨论】:

可能在 18.06.1 中修复,请参阅 github.com/moby/moby/issues/23043#issuecomment-417846760

以上是关于安装后 Docker 无法启动,并显示“环回附加失败”的主要内容,如果未能解决你的问题,请参考以下文章

docker如何启动并连入一个已有的容器

docker中Jenkins启动无法安装插件,版本过低

Keycloak Docker 容器重启后无法启动

在 Windows 上安装后无法启动 docker

yum 安装docker后 无法启动

为啥docker容器内无法启动tomcat,容器外可以