我有一个带有2个容器(Jenkins和Nexus,都有各自的命名卷)的docker环境。我每天都有一个cron作业,该作业会删除未使用的容器和图像。一切正常。但是问题出在我的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
/var/lib/docker/devicemapper/mnt
/var/lib/docker/devicemapper/devicemapper
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尽可能避免使用RVM精简池,或者在任何基于RHEL的任何设备上使用LVM精简池。如果无法更改存储驱动程序,则相同的过程至少将清除您无法回收的所有分配的稀疏空间。
devicemapper
更改存储驱动程序将需要转储/var/lib/docker包含所有docker数据的目录。有一些方法可以保存其中的一部分,但这涉及到与Docker内部的混乱。最好提交并导出要保留的任何容器或卷,并在更改后将其导入。否则,您将获得全新的空白Docker安装!
/var/lib/docker
汇出资料
停止Docker
去掉 /var/lib/docker
修改您的Docker启动以使用新的存储驱动程序。设置--storage-driver=<name>为 /lib/systemd/system/docker.service或/etc/systemd/system/docker.service或/etc/default/docker或/etc/sysconfig/docker
--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软件包中。
linux-image- extra
apt-get install linux-image-extra-$(uname -r) linux-image-extra-virtual
然后将存储驱动程序选项更改为 --storage-driver=aufs
--storage-driver=aufs
driver/)
OverlayFS在Ubuntu中已经可用,只需将存储驱动程序更改为,--storage-driver=overlay2或者--storage- driver=overlay如果您仍在使用3.x内核
--storage-driver=overlay2
--storage- driver=overlay
我不确定这是一个好主意。 它不会比循环文件差很多,但是 该overlay2驱动程序对于开发人员来说是非常可靠的,但尚未被考虑用于生产环境(例如Docker Enterprise不提供支持),但是由于以下原因,它被迫成为标准驱动程序AUFS /内核问题。
overlay2
mapper-driver/#/configure-direct-lvm-mode-for-production)
您可以直接使用LVM精简池来代替devicemapper循环文件。RHEL通过docker-storage- setup随其EPEL docker软件包一起分发的实用程序使此操作变得容易。Docker提供了手动设置卷的详细步骤。
docker-storage- setup
--storage-driver=devicemapper \ --storage-opt=dm.thinpooldev=/dev/mapper/docker-thinpool \ --storage-opt dm.use_deferred_removal=true
Docker 17.06+支持为您管理简单的direct- lvm块设备设置。
direct- lvm
只是永远不要用完LVM卷中的空间。最后,您将导致一个无响应的Docker守护进程,该守护进程需要被杀死,然后仍难以清除的仍在使用的LVM资源。