docker镜像的大小和虚拟大小有什么区别?

Ili*_*hev 8 containers image-size docker docker-registry

我有一个私人注册表,我存储了所有的docker镜像.

我注意到当我从中提取图像时,我本地计算机上的图像大小与注册表上图像大小的差异很大.

例如,我有一个名为mydb的图像(大约126 MB).

当我在我的本地机器上拉它并执行"docker images"时,它表示该图像"VIRTUAL SIZE"现在差不多大三倍(388 MB).

我想知道它是什么原因以及"VIRTUAL SIZE"实际上意味着什么.

谢谢 :) .

Gei*_*e V 10

你可以在这里找到这个概念的一个很好的解释:https : //github.com/docker/docker.github.io/issues/1520#issuecomment-305179362

从塔耶兹塔

“大小”和“虚拟大小”描述了容器使用的磁盘空间量。让我试着解释一下:

启动容器时,启动容器的镜像以只读方式挂载。最重要的是,安装了一个可写层,其中写入了对容器所做的任何更改。

镜像的只读层可以在从同一镜像启动的任何容器之间共享,而“可写”层对于每个容器都是唯一的(因为:您不希望在容器“a”中所做的更改出现在容器“b”微笑)

回到docker ps -s输出;

“大小”信息显示用于每个容器的可写层的数据量(在磁盘上)“虚拟大小”是用于容器使用的只读图像数据的磁盘空间总量,可写层。它被命名为“虚拟大小”的原因是(如前所述),只读层的磁盘空间可以在容器之间共享,因此只占用一次 磁盘空间(可能是一个不同的名称(“共享“尺寸?)事后看来会更好,但命名很难:))。编辑:virtual 实际上显示了只读层(图像)和容器的可写层的组合大小。

在下面的示例中,我启动了 10 个 nginx 容器;

在此处输入图片说明

所有这些容器都使用相同的映像,因此“虚拟大小”(示例中为 183MB)仅使用一次,无论从同一映像启动多少个容器 - 我可以启动 1 个或一千个容器;不使用额外的磁盘空间。“大小”(示例中为 2B)是每个容器唯一的,因此磁盘上使用的总空间为:

183MB + 10 * 2B

请注意,显示的大小不包括用于容器的所有磁盘空间。目前不包括的东西是;

  • 用于日志文件的磁盘空间(如果您使用 json-file 日志驱动程序) - 如果您的容器生成大量日志,并且日志轮换(最大文件/最大大小日志选项)是相当多的未配置
  • 容器使用的卷
  • 用于容器配置文件(hostconfig.json、config.v2.json、hosts、hostname、resolv.conf)的磁盘空间——
    尽管这些文件很小
  • 写入磁盘的内存(如果启用了交换)
  • 检查点(如果您使用的是实验性检查点/恢复功能)

  • *还引用*链接中的基本信息总是一个好主意(以防链接失效;并为未来的读者提供一个“起点”,从中了解链接中所说的内容。)来自该链接:“ **"size"** 信息显示了用于每个容器的**可写层**的数据量(在磁盘上)。**“虚拟大小”**是磁盘空间的总量用于容器使用的只读图像数据和 [加上] 可写层。” (2认同)

小智 -5

“虚拟”大小和常规大小并不神秘,但您应该记住,如果愿意的话,图像具有中间图像或“缓存”。因此,图像的虚拟大小就是您看到的大小:

docker images
Run Code Online (Sandbox Code Playgroud)

图像的图像磁盘大小是与该图像关联的所有缓存图像的总和,您可以通过以下方式查看:

docker images -a
Run Code Online (Sandbox Code Playgroud)