Docker 引擎不允许我删除旧容器

Docker 引擎不允许我删除旧容器

我有一个 docker 主机,上面有很多已退出的容器。由于我的疏忽,主机服务器的磁盘空间不足,这在很大程度上是由于这些容器造成的。我尝试使用 删除它们docker rm,但收到错误消息,提示磁盘空间不足,无法删除。然而,我当时并没有意识到这一点的潜在重要性,并且不再有具体的消息。

然后,我释放了设备上的某些空间并docker rm再次尝试,现在我收到此消息:

[me@machine ~]$ docker rm amazing_mahavira
Error response from daemon: Driver devicemapper failed to remove root filesystem 92c18d5ebe6cgc328225353064f30b1cb78e1ea668aad05c3d3d6e7095e20524:
devicemapper: Error running DeleteDevice dm_task_run failed

尝试docker save我的图像也失败了。

以下是docker info存储输出:

Storage Driver: devicemapper
 Pool Name: docker-253:0-273125642-pool
 Pool Blocksize: 65.54 kB
 Base Device Size: 10.74 GB
 Backing Filesystem: xfs
 Data file: /dev/loop0
 Metadata file: /dev/loop1
 Data Space Used: 92.09 GB
 Data Space Total: 107.4 GB
 Data Space Available: 14.24 MB
 Metadata Space Used: 587.1 MB
 Metadata Space Total: 2.147 GB
 Metadata Space Available: 14.24 MB
 Udev Sync Supported: true
 Deferred Removal Enabled: false
 Deferred Deletion Enabled: false
 Deferred Deleted Device Count: 0
 Data loop file: /var/lib/docker/devicemapper/devicemapper/data

我懂了此链接有类似的问题,除了看起来像是一个错误之外没有建议的解决方案。我在 docker github 上搜索了类似的问题,但没有发现。

对我来说,清理这一切以便再次拥有一个可以正常工作的 docker 主机的最佳方法是什么?虽然我确实想保存一些图像,但没有我绝对必须保留的容器或图像。我可以恢复这个安装吗,还是我注定要失败?

该服务器是 RHEL 7.2,FWIW。

答案1

我一直无法修复 docker devmapper 循环文件损坏。

如果重新启动整个机器无法解决这个问题,而且您无法保存图像docker save,我会将此 docker 设置标记为彻底失败。

让它恢复到原始工作状态的快速简便的方法是:

sudo service docker stop
sudo rm /var/lib/docker/*
sudo service start

这将删除全部您当前的 docker 数据,包括镜像、容器、卷、网络等。Docker 将重新创建所有需要的文件,就像新的一样。

在不久的将来,不仅要对磁盘空间进行监控,而且还要交换到其他存储驱动程序之一。

查看docker 文档关于这个主题。最简单的方法可能是overlay(或者overlay2如果您有 4.0+ 内核)如果您的内核支持它,或者aufs(在 RHEL 上可能不那么容易,因为没有官方支持)。

另一个稍微更具挑战性(但仍然不是很难)的解决方案是将 devicemapper 切换为 direct-lvm 而不是 loop-lvm(现在的)。RHEL Atomic 文档提到docker-storage-setup哪些应该有助于/自动设置 direct-lvm,但我在这方面经验有限

相关内容