清理docker环境:devicemapper

时间:2016-06-07 06:30:19

标签: docker device-mapper

我有一个包含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

这个空间是什么,我可以在不破坏东西的情况下清理它吗?

4 个答案:

答案 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安装!

  1. 导出数据

  2. 停止Docker

  3. 删除/var/lib/docker

  4. 修改docker startup以使用新的存储驱动程序。 在--storage-driver=<name>/lib/systemd/system/docker.service/etc/systemd/system/docker.service/etc/default/docker

  5. 中设置/etc/sysconfig/docker
  6. 启动Docker

  7. 导入数据

  8. AUFS

    AUFS不在主线内核中(并且永远不会),这意味着发行版必须以某种方式主动包含它。对于Ubuntu,它位于linux-image-extra包中。

    apt-get install linux-image-extra-$(uname -r) linux-image-extra-virtual
    

    然后将存储驱动程序选项更改为--storage-driver=aufs

    OverlayFS

    OverlayFS已在Ubuntu中使用,如果您仍在使用3.x内核,只需将存储驱动程序更改为--storage-driver=overlay2--storage-driver=overlay

    我不确定现在这个想法有多好。它不能比循环文件差很多但是 overlay2驱动程序非常适合开发使用,但尚未被视为生产就绪(例如Docker Enterprise不提供支持),但由于AUFS /内核问题,它被推送成为标准驱动程序。

    Direct LVM Thin Pool

    您可以直接使用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 devicemapperofficial 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 Driverdevicemapper(而不是aufs),请谨慎使用这些文件夹。
例如,请参阅issue 18867

答案 2 :(得分:0)

我遇到了同样的问题,即我的/ var / lib / docker / devicemapper / devicemapper / data文件中的根卷已达到根卷的91%(约50G的45G)。我尝试删除所有不需要的图像,删除卷,没有任何帮助减少此文件。

进行了一些谷歌搜索,并了解到“数据”文件是回送安装的稀疏文件,而docker使用它来存储装载位置以及我们将存储在容器内的其他文件。

最后,我删除了之前运行并停止的所有图像

docker rm $(docker ps -aq)

大大减少了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 ...
  • 对于图像,使用Dockerfile的LABEL,例如LABEL protected=true
  • 要将标签添加到无法轻易重建的现有映像中,请使用上述内容制作一个两行的Dockerfile,构建一个新映像,然后将新映像切换为旧映像(标签)。

通用Docker label documentation