清洁docker环境:devicemapper
我有一个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
docker /var/lib/docker/devicemapper/mnt
是7.3G /var/lib/docker/devicemapper/devicemapper
docker /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
这个空间是什么,我能够清理这个东西而不破坏东西?
不要严重使用devicemapper循环文件 ! Docker对此有很大的警告。
/var/lib/docker/devicemapper/devicemapper
目录包含稀疏循环文件,其中包含docker装入的所有数据。 所以你需要使用lvm工具来拖拽它们并做些事情。 有一个阅读虽然与devicemapper删除问题 ,他们有点分解,但也许不是。
我会尽可能远离devicemapper
,或者在基于RHEL的任何环境中使用LVM精简池。 如果您无法更改存储驱动程序,则相同的过程至less会清除您无法回收的任何已分配的稀疏空间。
更改Docker存储驱动程序
更改存储驱动程序将需要转储包含所有泊坞窗数据的/var/lib/docker
目录。 有一些方法可以保存它的一部分,但涉及到Docker内部的混乱。 更好地提交并导出所有要保留的容器或卷,并在更改后导入它们。 否则,你将有一个新的空白docker安装!
-
导出数据
-
停止Docker
-
删除
/var/lib/docker
-
修改您的docker启动使用新的存储驱动程序。 在
/lib/systemd/system/docker.service
或/etc/systemd/system/docker.service
或/etc/default/docker
/lib/systemd/system/docker.service
或/etc/sysconfig/docker
/lib/systemd/system/docker.service
设置--storage-driver=<name>
-
启动Docker
-
导入数据
AUFS
AUFS不在主线内核(永远不会),这意味着发行版必须以某种方式积极包含它。 对于Ubuntu,它在linux-image-extra
软件包中。
apt-get install linux-image-extra-$(uname -r) linux-image-extra-virtual
然后将存储驱动程序选项更改为--storage-driver=aufs
OverlayFS
OverlayFS在Ubuntu中已经可用,只要将存储驱动程序更改为--storage-driver=overlay2
或--storage-driver=overlay
如果仍然使用3.x内核
我不确定这个想法现在有多好。 它不会比循环文件差得多,但是 overlay2
驱动对于dev的使用来说是非常稳固的,但是并没有被认为是生产准备好的(例如Docker Enterprise不提供支持),但它被推动成为标准的驱动程序到AUFS / Kernel的问题。
直接LVM精简池
您可以直接使用LVM精简池,而不是devicemapper循环文件。 通过一个docker-storage-setup
实用程序,RHEL可以很方便地使用他们的EPEL docker软件包进行分发。 Docker有手动设置卷的详细步骤 。
--storage-driver=devicemapper \ --storage-opt=dm.thinpooldev=/dev/mapper/docker-thinpool \ --storage-opt dm.use_deferred_removal=true
Docker 17.06+支持为您pipe理简单direct-lvm
块设备设置。
只是不要用完LVM卷中的空间。 您最终会遇到一个无法响应的Docker守护进程,这个守护进程需要被终止,然后仍在使用中的LVM资源很难清理。
首先, 什么是devicemapper ( 官方文档 )
从2.6.9版本开始,Device Mapper已经被包含在主要的Linux内核中。 它是RHEL Linux发行版系列的核心部分。
devicemapper驱动程序将每个映像和容器存储在自己的虚拟设备上。 这些设备是精简configuration的写入时复制快照设备。
Device Mapper技术在块级而非文件级运行。 这意味着devicemapper存储驱动程序的自动精简configuration和写时复制操作可以使用块而不是整个文件。devicemapper是某些Linux发行版的默认Docker存储驱动程序。
运行devicemapper存储驱动程序的Docker主机默认为称为loop-lvm的configuration模式。 此模式使用稀疏文件构build图像和容器快照使用的精简池
Docker 1.10及更高版本不再与/ var / lib / docker中的目录名称匹配。
但是,有两个关键目录。
/var/lib/docker/devicemapper/mnt
目录包含图像和容器图层的装入点 。- / var / lib / docker / devicemapper / metadatadirectory包含每个图像层和容器快照的一个文件。
如果您的docker info
确实显示您的Storage Driver
是devicemapper
(而不是aufs
),请谨慎使用这些文件夹。
见例如问题18867 。