清理docker环境:devicemapper

新手上路,请多包涵

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

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

原文由 DenCowboy 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 1.5k
2 个回答

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

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

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

更改 docker 存储驱动程序

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

  1. 导出数据

  2. 停止 Docker

  3. 删除 /var/lib/docker

  4. 修改您的 docker 启动以使用新的存储驱动程序。 Set --storage-driver=<name> in /lib/systemd/system/docker.service or /etc/systemd/system/docker.service or /etc/default/docker or /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 循环文件。 RHEL 使用 docker-storage-setup 实用程序使这变得容易,该实用程序与他们的 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 资源。

原文由 Matt 发布,翻译遵循 CC BY-SA 3.0 许可协议

在我使用 devicemapper 而不是 LVM 精简池的系统上,定期 docker system prune -a 适用于我。我使用的模式是:

  • 如果我希望它们免于清理,我会用标签“ protected ”标记任何容器、图像等
  • 然后我定期运行 docker system prune -a --filter=label!=protected (手动或在 cron 上使用 -f

标注示例:

  • docker run --label protected ...
  • docker create --label=protected=true ...
  • 对于图像,Dockerfile 的 LABEL ,例如 LABEL protected=true
  • 要将标签添加到我无法轻松重建的现有图像,我使用上述内容制作了一个 2 行 Dockerfile,构建了一个新图像,然后将新图像切换为旧图像(标签)。

通用 Docker 标签文档

原文由 Akom 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题
logo
Stack Overflow 翻译
子站问答
访问
宣传栏