首页 > 解决方案 > Docker 容器显示错误的磁盘大小

问题描述

如果我运行,我有一个 mysql 容器正在运行:

docker container ls -s
# 3.09MB (virtual 450MB)

但是,如果我在容器内运行:

du -h /var/lib/mysql/test/
14G

我没有设置卷。

命令的扩展是docker container ls -s什么?好像没有显示mysql数据消耗。我可以使用什么命令来显示正在运行的容器的总磁盘消耗?

标签: mysqldockerdiskspace

解决方案


我认为没有命令可以显示正在运行的容器的当前磁盘使用情况。问题是由于分层文件系统和卷安装有多个部分:

  1. 映像中的每个文件系统层
  2. 容器特定的可写层
  3. 卷上的任何数据

docker 命令可能表示的是第 1 项的总和。然而,即使这也只是一半的事实,因为一层可能在多个图像和多个容器之间共享。换句话说,如果你把所有容器的这些加起来,你最终会得到一个大于主机上所有磁盘使用量的数字。

从容器内部,一个du命令将显示组装层的结果,包括容器可写层,它可以报告磁盘空间,因为一层可能隐藏先前文件系统层的文件。但它也会显示不在映像或容器文件系统中的文件的使用情况。因此,从该命令到实际磁盘使用情况没有 1:1 映射。

卷使这进一步复杂化,因为它们从分层文件系统外部挂载文件。即使您没有定义卷,如果映像创建者在路径上定义了卷,也会为您创建一个匿名卷。

Docker 命令可能不会显示实际的磁盘使用情况,因为运行该命令的时间是无限的,需要递归遍历目录树,并且在遍历完成之前结果可能会发生变化。但是,如果您想自己计算,所需的步骤包括:

  1. 将映像的每一层的磁盘空间相加,可能将其划分为基于同一层的其他容器
  2. 添加容器可写层的磁盘空间
  3. 为每个卷安装添加磁盘空间

这些路径在容器检查命令中可见。请注意,1 容易出错,因为可以快速创建和销毁使用共享层的容器。并且 3 容易出错,因为从主机挂载根文件系统是完全可以接受的,这使得容器递归地报告它正在使用整个主机上的所有文件,这会下降到容器中并重复。


推荐阅读