我有一个 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,但我在这方面经验有限