清理docker环境:devicemapper

2024-03-20

我有一个包含 2 个容器的 docker 环境(Jenkins 和 Nexus,都有自己的命名卷)。 我每天都有一个 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/

Images:

/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 is 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

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


不要将 devicemapper 循环文件用于任何严重的事情 http://www.projectatomic.io/blog/2015/06/notes-on-fedora-centos-and-docker-storage-drivers/! Docker对此有很大的警告。

The /var/lib/docker/devicemapper/devicemapper目录包含稀疏循环文件,其中包含 docker 挂载的所有数据。因此,您需要使用 lvm 工具来搜索它们并执行操作。不过请读一读消除 devicemapper 的问题 https://github.com/docker/docker/issues/3182,他们有点解决了,但也许没有。

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

更改 docker 存储驱动程序

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

  1. 导出数据

  2. 停止 Docker

  3. Remove /var/lib/docker

  4. 修改您的 docker 启动以使用新的存储驱动程序。 放--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 https://docs.docker.com/engine/userguide/storagedriver/aufs-driver/

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

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

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

覆盖文件系统 https://docs.docker.com/engine/userguide/storagedriver/overlayfs-driver/

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

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

直接 LVM 精简池 https://docs.docker.com/engine/userguide/storagedriver/device-mapper-driver/#/configure-direct-lvm-mode-for-production

您可以直接使用 LVM 精简池,而不是 devicemapper 循环文件。 RHEL 通过以下方式让这一切变得简单docker-storage-setup https://github.com/projectatomic/docker-storage-setup/blob/master/docker-storage-setup.sh随 EPEL docker 包一起分发的实用程序。Docker 有手动设置卷的详细步骤 https://docs.docker.com/engine/userguide/storagedriver/device-mapper-driver/#configure-direct-lvm-mode-for-production.

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

Docker 17.06+ 支持管理简单direct-lvm为您设置块设备。 https://docs.docker.com/engine/userguide/storagedriver/device-mapper-driver/#configure-direct-lvm-mode-for-production

只是永远不要耗尽 LVM 卷中的空间。最终,您会遇到需要终止的无响应 Docker 守护进程,以及仍在使用且难以清理的 LVM 资源。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

清理docker环境:devicemapper 的相关文章

随机推荐

  • 如何使用 spacy 或 nltk 检索句子的主要意图?

    我有一个用例 我想使用 spacy 或 nltk 或任何 NLP 库提取句子的主要有意义部分 例句1 我怎样才能发出反对骚扰的声音 意图是 大声疾呼反对骚扰 例句2 唐老鸭是由哪个漫画家 哪个人 谁创作的 意图是 唐老鸭是由 创造的 例句3
  • 使用实体框架记录每个数据更改

    客户需要将每个数据更改与进行修改的实际用户一起记录到日志表中 该应用程序使用一个 SQL 用户来访问数据库 但我们需要记录 真实 用户 ID 我们可以在 t sql 中通过为每个表插入和更新编写触发器并使用 context info 来存储
  • 从 C++ 中的给定文件点读取目录

    我有两个程序将同时读取 写入文件到同一目录 但不会同时读取 写入文件 我已经完成了写作部分 但我正在努力获得阅读目录部分的一半体面且有效的实现 目录中的文件遵循以下命名方案 Image INDEX KEY DEL TIMESTAMP IND
  • Azure Function CosmosDBTrigger 不可扩展

    我有一个带有 CosmosDBTrigger 的 Azure 函数 用于使用 Application Insights 监控的消费游戏 正在监控的集合有500 000插入更改提要中 消费计划将实例数量扩大到15几分钟之内 但只有第一个实例能
  • 使用 axios 递归获取数据并链接结果

    我有一个模式的网址http www data com 1 其中末尾的 1 可以一直运行到一个未预定义的数字 它返回一个数组 我需要将我得到的所有数组连接成一个 我的策略是递归执行 get 请求 直到收到 404 错误 然后返回结果 var
  • Kubernetes 上的 Spring Boot 应用程序 如何使用外部 message.properties 文件来支持 i18n 和 l10n?

    我们有一个部署到 Kubernetes 的 Spring Boot 应用程序 我们正在向此应用程序添加 i18n 功能 并希望将 messages properties 文件放置在应用程序 jar war 之外 我已经能够在春季启动中做到这
  • PowerShell 代码整洁还是重新格式化? [复制]

    这个问题在这里已经有答案了 可能的重复 有 PowerShell 代码格式化程序 漂亮的打印机吗 https stackoverflow com questions 2987176 is there a powershell code fo
  • 如何在数据框中按名称删除列

    我有一个很大的数据集 我想阅读特定的列或删除所有其他列 data lt read dta file dta 我选择我不感兴趣的列 var out lt names data names data in c iden name x serv
  • 反向填充猫鼬

    我怎样才能反向填充 mongo 我有 2 个模式 User var user scheme new mongoose Schema name String age Number roles type mongoose Schema Type
  • GNU less 的 bash 循环每 2 分钟刷新一次

    我有一台 Linux 机器 其中有一个数据文件夹和一个脚本 该脚本会生成一个报告 xlsx 电子表格文件 显示正在运行的文件夹中不断变化的内容 我使用 xlsx2tsv 脚本将其转换为 tsv 文本 耗时不到一秒 该脚本大约需要 1 分钟来
  • 使用 Typescript 和 React 三纤维的着色器

    我正在尝试将着色器与 React 三纤维和 Typescript 一起使用 着色器文件 import ShaderMaterial from three import extend from react three fiber class
  • 在类组件的方法中获取查询

    Apollo 客户端 2 6 3 与反应 是否可以在类组件的方法中获取数据 我正在构建一个全局搜索组件 并且我只想在键入第三个 以及每个后续 字符时才获取 数据 现在它是用 fetch api 实现的 但我想切换到 apollo 客户端和
  • 如何使用 gitignore 忽略非点文件(所有非隐藏目录,在我的存储库的根目录中)?

    我想跟踪我的 点文件 我想要 gitignore 来忽略所有隐藏文件 文件扩展名 本质上与以下相反 Git 如何忽略隐藏目录 https stackoverflow com questions 8021441 git how to igno
  • 如何使特定单词在文本中易于理解其含义?

    我正在为 iPhone 开发一本散文书 所以我将所有诗歌和文本存储在核心数据中 一个名为story以及名为的属性details其中包含整个轶事 但问题就在这里 如果用户想要触摸特定的单词和诗歌来了解它们的含义和定义 我应该如何处理这个任务
  • 销毁 Backbone 集合中每个模型的最简洁方法?

    第一次尝试时我写了 this collection each function element element destroy 这不起作用 因为它类似于ConcurrentModificationException在 Java 中 所有其他
  • java 1.7 中的无效标志参数

    我的任务是使用 Java 7 创建 spring boot 应用程序 因此 像往常一样 我在 start spring io 资源上创建了一个模板 并通过以下方式打开他File gt New gt Project from Existing
  • 未定义的预处理器变量“$(var.WixInstall.TargetPath)”。 WixInstaller D:work\Extractor\WixInstaller\Product.wxs

    我在使用 wix 创建 Windows 安装程序时遇到以下错误 未定义的预处理器变量 var WixInstall TargetPath WixInstaller D work Extractor WixInstaller Product
  • 在mongo中执行优先级查询

    样本文件 name John age 35 address join month 3 的员工优先级为 1 地址包含字符串 Avenue 的员工优先级为 2 地址包含字符串 Street 的员工优先级为 3 地址包含字符串 Road 的员工优
  • 与 Swingworker 的对话是先有鸡还是先有蛋

    我试图遵循 Java 最佳实践 不在主线程 EDT 上执行长时间任务 所以我计划使用带有模态对话框的 swingWorker 这样 模式对话框会阻止用户执行任何操作 直到该任务完成 并且我可以在该过程发生时更新对话框上的状态 现在的问题是
  • 清理docker环境:devicemapper

    我有一个包含 2 个容器的 docker 环境 Jenkins 和 Nexus 都有自己的命名卷 我每天都有一个 cron 作业 它会删除未使用的容器和图像 这工作正常 但问题出在我的 devicemapper 内部 du sh var l