43

我有一个带有 2 个容器(Jenkins 和 Nexus,都有自己的命名卷)的 docker 环境。我每天都有一个删除未使用的容器和图像的 cron 作业。这工作正常。但问题出在我的设备映射器内部:

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/

设备映射器:

/var/lib/docker# du -sh devicemapper/
  16G   devicemapper/

/var/lib/docker/devicemapper/mnt是 7.3G /var/lib/docker/devicemapper/devicemapper是 8.1G

码头工人信息:

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

4 回答 4

55

不要将 devicemapper 循环文件用于任何严重的事情!Docker 对此有很大的警告。

/var/lib/docker/devicemapper/devicemapper目录包含稀疏循环文件,其中包含 docker 挂载的所有数据。所以你需要使用 lvm 工具来搜索它们并做一些事情。阅读一下 devicemapper 的删除问题,它们有点解决了,但可能没有。

我会尽可能远离devicemapper或在任何基于 RHEL 的设备上使用 LVM 精简池。如果您无法更改存储驱动程序,那么相同的过程至少会清除任何您无法回收的已分配稀疏空间。

更改 docker 存储驱动程序

更改存储驱动程序将需要转储/var/lib/docker包含所有 docker 数据的目录。有一些方法可以保存其中的一部分,但这涉及到弄乱 Docker 内部。最好提交和导出您想要保留的任何容器或卷,并在更改后导入它们。否则你将有一个全新的、空白的 Docker 安装!

  1. 导出数据

  2. 停止 Docker

  3. 消除/var/lib/docker

  4. 修改您的 docker 启动以使用新的存储驱动程序。设置--storage-driver=<name>/lib/systemd/system/docker.serviceor/etc/systemd/system/docker.service/etc/default/dockeror/etc/sysconfig/docker

  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驱动程序对于开发人员使用来说非常可靠,但还没有被认为是生产就绪(例如 Docker Enterprise 不提供支持),但由于以下原因,它正被推动成为标准驱动程序AUFS/内核问题。

直接 LVM 精简池

您可以直接使用 LVM 精简池,而不是 devicemapper 循环文件。docker-storage-setupRHEL 使用随其 EPEL docker 软件包分发的实用程序使这变得容易。Docker 有手动设置卷的详细步骤

--storage-driver=devicemapper \
--storage-opt=dm.thinpooldev=/dev/mapper/docker-thinpool \
--storage-opt dm.use_deferred_removal=true

Docker 17.06+ 支持为您管理简单的direct-lvm块设备设置。

永远不要用完 LVM 卷中的空间。你最终会得到一个无响应的 Docker 守护程序,需要被杀死,然后是仍在使用中且难以清理的 LVM 资源。

于 2016-06-07T13:51:26.580 回答
6

在我使用devicemapper而不是 LVM 瘦池的系统上,定期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
  • 要将标签添加到我无法轻松重建的现有图像,我使用上述内容制作了一个 2 行 Dockerfile,构建了一个新图像,然后将新图像切换为旧图像(标签)。

通用 Docker标签文档

于 2019-08-23T18:24:34.173 回答
3

一、什么是devicemapper官方文档

自 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/metadata 目录为每个镜像层和容器快照包含一个文件。

如果您docker info确实显示您的Storage Driveris devicemapper(而不是aufs),请谨慎处理这些文件夹。
参见例如问题 18867

于 2016-06-07T07:14:06.307 回答
1

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

做了一些谷歌搜索并了解到“数据”文件是环回安装的稀疏文件,docker使用它来存储安装位置和我们将存储在容器中的其他文件。

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

警告:删除所有 docker 容器

docker rm $(docker ps -aq)

显着减少了 devicemapper 文件。希望这可以帮助你。

于 2019-04-06T08:44:02.577 回答