mysql - Docker 容器显示错误的磁盘大小
问题描述
如果我运行,我有一个 mysql 容器正在运行:
docker container ls -s
# 3.09MB (virtual 450MB)
但是,如果我在容器内运行:
du -h /var/lib/mysql/test/
14G
我没有设置卷。
命令的扩展是docker container ls -s
什么?好像没有显示mysql数据消耗。我可以使用什么命令来显示正在运行的容器的总磁盘消耗?
解决方案
我认为没有命令可以显示正在运行的容器的当前磁盘使用情况。问题是由于分层文件系统和卷安装有多个部分:
- 映像中的每个文件系统层
- 容器特定的可写层
- 卷上的任何数据
docker 命令可能表示的是第 1 项的总和。然而,即使这也只是一半的事实,因为一层可能在多个图像和多个容器之间共享。换句话说,如果你把所有容器的这些加起来,你最终会得到一个大于主机上所有磁盘使用量的数字。
从容器内部,一个du
命令将显示组装层的结果,包括容器可写层,它可以报告磁盘空间,因为一层可能隐藏先前文件系统层的文件。但它也会显示不在映像或容器文件系统中的文件的使用情况。因此,从该命令到实际磁盘使用情况没有 1:1 映射。
卷使这进一步复杂化,因为它们从分层文件系统外部挂载文件。即使您没有定义卷,如果映像创建者在路径上定义了卷,也会为您创建一个匿名卷。
Docker 命令可能不会显示实际的磁盘使用情况,因为运行该命令的时间是无限的,需要递归遍历目录树,并且在遍历完成之前结果可能会发生变化。但是,如果您想自己计算,所需的步骤包括:
- 将映像的每一层的磁盘空间相加,可能将其划分为基于同一层的其他容器
- 添加容器可写层的磁盘空间
- 为每个卷安装添加磁盘空间
这些路径在容器检查命令中可见。请注意,1 容易出错,因为可以快速创建和销毁使用共享层的容器。并且 3 容易出错,因为从主机挂载根文件系统是完全可以接受的,这使得容器递归地报告它正在使用整个主机上的所有文件,这会下降到容器中并重复。
推荐阅读
- amazon-web-services - 使用容量提供程序和 ECS 需要多长时间才能移除实例?
- android - 想要验证 Firebase 上的数据
- javascript - 无法调用“setTimeout”,因为函数 [1] 需要另一个参数
- r - 我无法从使用estimateNetwork() 计算的网络中提取强度中心值是什么?
- python - 在python中嵌套for循环的情况下如何使用threadPoolExecutor的map()
- image - React Native 如何在输入中粘贴图像
- c# - 如何使用 c# 从 mysql 表中减去数量?
- python - Numpy:对于一维中的每个元素,找到子数组的最大值坐标
- javascript - 在 Mongoose Schema 中使用雪花作为类型
- vbscript - 使用 IE 浏览器按下时无法区分 CTRL 和 ALT Gr