我有一个带有 2 个容器(Jenkins 和 Nexus,都有自己的命名卷)的 docker 环境。我每天都有一个删除未使用的容器和图像的 cron 作业。这工作正常。但问题出在我的设备映射器内部:
du -sh /var/lib/docker/
30G docker/
我可以在我的 docker 文件夹中的每个文件夹: 卷(大,但在我的情况下这是正常的):
/var/lib/docker# du -sh volumes/
14G volumes/
容器:
/var/lib/docker# du -sh containers/
3.2M containers/
图片:
/var/lib/docker# du -sh image/
5.8M image/
设备映射器:
/var/lib/docker# du -sh devicemapper/
16G devicemapper/
/var/lib/docker/devicemapper/mnt
是 7.3G /var/lib/docker/devicemapper/devicemapper
是 8.1G
码头工人信息:
Storage Driver: devicemapper
Pool Name: docker-202:1-xxx-pool
Pool Blocksize: 65.54 kB
Base Device Size: 10.74 GB
Backing Filesystem: ext4
Data file: /dev/loop0
Metadata file: /dev/loop1
Data Space Used: 5.377 GB
Data Space Total: 107.4 GB
Data Space Available: 28.8 GB
Metadata Space Used: 6.148 MB
Metadata Space Total: 2.147 GB
Metadata Space Available: 2.141 GB
Udev Sync Supported: true
这个空间是什么,我可以在不破坏东西的情况下清理它吗?
原文由 DenCowboy 发布,翻译遵循 CC BY-SA 4.0 许可协议
不要将 devicemapper 循环文件用于任何严重的事情! Docker 对此有很大的警告。
/var/lib/docker/devicemapper/devicemapper
目录包含稀疏循环文件,其中包含 docker 挂载的所有数据。所以你需要使用 lvm 工具来搜索它们并做一些事情。阅读 一下 devicemapper 的删除问题,它们有点解决了,但可能没有。我会尽可能远离
devicemapper
或在任何基于 RHEL 的设备上使用 LVM 精简池。如果您无法更改存储驱动程序,则相同的过程至少会清除您无法回收的所有已分配稀疏空间。更改 docker 存储驱动程序
更改存储驱动程序需要转储包含所有 docker 数据的
/var/lib/docker
目录。有一些方法可以保存其中的一部分,但这涉及到弄乱 Docker 内部。最好提交和导出您想要保留的任何容器或卷,并在更改后导入它们。否则你将有一个全新的、空白的 Docker 安装!导出数据
停止 Docker
删除
/var/lib/docker
修改您的 docker 启动以使用新的存储驱动程序。 Set
--storage-driver=<name>
in/lib/systemd/system/docker.service
or/etc/systemd/system/docker.service
or/etc/default/docker
or/etc/sysconfig/docker
启动 Docker
导入数据
AUFS
AUFS 不在主线内核中(并且永远不会),这意味着发行版必须以某种方式主动包含它。对于 Ubuntu,它位于
linux-image-extra
包中。然后将存储驱动程序选项更改为
--storage-driver=aufs
OverlayFS
OverlayFS 已在 Ubuntu 中可用,只需将存储驱动程序更改为
--storage-driver=overlay2
或--storage-driver=overlay
如果您仍在使用 3.x 内核我不确定这是一个多么好的主意。它不会比循环文件差多少,但是
overlay2
驱动程序非常适合开发人员使用,但尚未考虑生产就绪(例如 Docker Enterprise 不提供支持),但它正在被推送由于 AUFS/内核问题而成为标准驱动程序。直接 LVM 精简池
您可以直接使用 LVM 精简池,而不是 devicemapper 循环文件。 RHEL 使用
docker-storage-setup
实用程序使这变得容易,该实用程序与他们的 EPEL docker 包一起分发。 Docker 有手动设置卷的详细步骤。Docker 17.06+ 支持 为您管理简单的
direct-lvm
块设备设置。永远不要用完 LVM 卷中的空间。您最终会得到一个无响应的 Docker 守护程序,需要被杀死,然后是仍在使用且难以清理的 LVM 资源。