清洁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安装!

  1. 导出数据

  2. 停止Docker

  3. 删除/var/lib/docker

  4. 修改您的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>

  5. 启动Docker

  6. 导入数据

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 Driverdevicemapper (而不是aufs ),请谨慎使用这些文件夹。
见例如问题18867 。