我有一个包含2个容器的Docker环境(Jenkins和Nexus,两者都有自己的命名卷)。 我有一个每日cron-job,删除未使用的容器和图像。这工作正常。但问题出在我的devicemapper中:
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/
Devicemapper:
/var/lib/docker# du -sh devicemapper/
16G devicemapper/
/var/lib/docker/devicemapper/mnt
是7.3G
/var/lib/docker/devicemapper/devicemapper
是8.1G
Docker信息:
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
这个空间是什么,我可以在不破坏东西的情况下清理它吗?
答案 0 :(得分:41)
Don't use a devicemapper loop file for anything serious! Docker对此有很大的警告。
/var/lib/docker/devicemapper/devicemapper
目录包含稀疏循环文件,其中包含docker挂载的所有数据。所以你需要使用lvm工具来搜索它们并做一些事情。虽然阅读the remove issues with devicemapper,但它们有点解决但可能没有。
我会尽可能远离devicemapper
或在基于RHEL的任何内容上使用LVM精简池。如果您无法更改存储驱动程序,则相同的过程将至少清除您无法回收的任何已分配的稀疏空间。
更改存储驱动程序将需要转储包含所有docker数据的/var/lib/docker
目录。有一些方法可以保存它的一部分,但这涉及到搞乱Docker的内部。最好提交并导出要保留的任何容器或卷,并在更改后导入它们。否则你将有一个新的空白Docker安装!
导出数据
停止Docker
删除/var/lib/docker
修改docker startup以使用新的存储驱动程序。
在--storage-driver=<name>
或/lib/systemd/system/docker.service
或/etc/systemd/system/docker.service
或/etc/default/docker
/etc/sysconfig/docker
启动Docker
导入数据
AUFS不在主线内核中(并且永远不会),这意味着发行版必须以某种方式主动包含它。对于Ubuntu,它位于linux-image-extra
包中。
apt-get install linux-image-extra-$(uname -r) linux-image-extra-virtual
然后将存储驱动程序选项更改为--storage-driver=aufs
OverlayFS已在Ubuntu中使用,如果您仍在使用3.x内核,只需将存储驱动程序更改为--storage-driver=overlay2
或--storage-driver=overlay
我不确定现在这个想法有多好。它不能比循环文件差很多但是
overlay2
驱动程序非常适合开发使用,但尚未被视为生产就绪(例如Docker Enterprise不提供支持),但由于AUFS /内核问题,它被推送成为标准驱动程序。
您可以直接使用LVM精简池,而不是devicemapper循环文件。 RHEL通过与其EPEL docker软件包一起分发的docker-storage-setup
实用程序轻松实现这一点。 Docker have detailed steps for setting up the volumes manually。
--storage-driver=devicemapper \
--storage-opt=dm.thinpooldev=/dev/mapper/docker-thinpool \
--storage-opt dm.use_deferred_removal=true
Docker 17.06+支持managing simple direct-lvm
block device setups for you.
永远不要耗尽LVM卷中的空间。您最终会得到一个需要被杀死的无响应的Docker守护程序,然后是仍在使用中且难以清理的LVM资源。
答案 1 :(得分:3)
首先,what is devicemapper(official documentation)
自2.6.9版以来,Device Mapper已包含在主线Linux内核中。它是RHEL系列Linux发行版的核心部分。
devicemapper驱动程序将每个图像和容器存储在自己的虚拟设备上。这些设备是精简配置的写时复制快照设备 Device Mapper技术在块级而不是文件级工作。这意味着devicemapper存储驱动程序的精简配置和写时复制操作可以使用块而不是整个文件。
devicemapper是某些Linux发行版上的默认Docker存储驱动程序。
运行devicemapper存储驱动程序的Docker主机默认使用称为loop-lvm的配置模式。此模式使用稀疏文件来构建映像和容器快照使用的精简池
Docker 1.10及更高版本不再将图像层ID与/ var / lib / docker中的目录名匹配 但是,有两个关键目录。
/var/lib/docker/devicemapper/mnt
目录包含图像和容器图层的装入点。- / var / lib / docker / devicemapper / metadatadirectory包含每个图像层和容器快照的一个文件。
如果您的docker info
确实显示您的Storage Driver
为devicemapper
(而不是aufs
),请谨慎使用这些文件夹。
例如,请参阅issue 18867。
答案 2 :(得分:0)
我遇到了同样的问题,即我的/ var / lib / docker / devicemapper / devicemapper / data文件中的根卷已达到根卷的91%(约50G的45G)。我尝试删除所有不需要的图像,删除卷,没有任何帮助减少此文件。
进行了一些谷歌搜索,并了解到“数据”文件是回送安装的稀疏文件,而docker使用它来存储装载位置以及我们将存储在容器内的其他文件。
最后,我删除了之前运行并停止的所有图像
大大减少了devicemapper文件。希望这对您有帮助 。
答案 3 :(得分:0)
在我使用 devicemapper 而不是LVM Thinpool的系统上,定期docker system prune -a
对我有用。我使用的模式是:
protected
” docker system prune -a --filter=label!=protected
(手动运行或使用 -f 在cron上运行)标签示例:
docker run --label protected ...
docker create --label=protected=true ...
LABEL protected=true
通用Docker label documentation