docker 镜像的大小和虚拟大小有啥区别?
Posted
技术标签:
【中文标题】docker 镜像的大小和虚拟大小有啥区别?【英文标题】:What is the difference between the size and the virtual size of the docker images?docker 镜像的大小和虚拟大小有什么区别? 【发布时间】:2016-10-24 07:59:30 【问题描述】:我有一个私有注册表,用于存储我的所有 docker 映像。
我注意到,当我从中提取图像时,本地计算机上的图像大小与注册表上的图像大小差异很大。
例如,我有一个名为 mydb 的图像(大约 126 MB)。
当我将它拉到我的本地机器上并执行 "docker images" 时,它会显示该图像的 "VIRTUAL SIZE"现在几乎是原来的三倍 (388 MB)。
我想知道它的原因是什么以及“虚拟大小”的实际含义。
谢谢你:)。
【问题讨论】:
【参考方案1】:你可以在这里找到这个概念的一个很好的解释:https://github.com/docker/docker.github.io/issues/1520#issuecomment-305179362
来自 thaJeztah
“大小”和“虚拟大小”描述了使用的磁盘空间量 由一个容器。让我试着解释一下:
启动容器时,容器启动时的镜像 from 以只读方式安装。最重要的是,一个可写层是 挂载,对容器所做的任何更改都会写入其中。
图像的只读层可以在任何容器之间共享 从同一个图像开始,而“可写”层是 每个容器唯一(因为:您不希望在 容器“a”出现在容器“b”微笑)
回到
docker ps -s
输出;“大小”信息显示使用的数据量(在磁盘上) 对于每个容器的可写层,“虚拟大小”是 用于只读图像数据的磁盘空间总量 容器和可写层。它被命名为“虚拟”的原因 size”,是(如前所述),用于 只读层可以在容器之间共享,所以只占用 磁盘空间 once
(可能是不同的名称(“共享”大小?) 事后看来更好,但命名很难:))。编辑:virtual
实际上显示了只读层(图像)的组合大小, 以及容器的可写层。在下面的例子中,我启动了 10 个 nginx 容器;
所有这些容器都使用相同的图像,因此“虚拟大小”(183MB 在示例中)仅使用一次,无论有多少容器 从同一个图像开始 - 我可以启动 1 个容器或一个 千;没有使用额外的磁盘空间。 “大小”(示例中为 2B) 但是每个容器都是唯一的,因此磁盘上使用的总空间是:
183MB + 10 * 2B
请注意,显示的大小不包括用于 一个容器。目前不包括的东西是;
用于日志文件的磁盘空间(如果您使用 json-file 日志记录驱动程序) - 如果您的容器生成很多,这可能会相当多 日志,并且日志轮换(最大文件/最大大小日志记录选项)不是 已配置 容器使用的卷 用于容器配置文件(hostconfig.json、config.v2.json、hosts、hostname、resolv.conf)的磁盘空间- 虽然这些文件很小 内存写入磁盘(如果启用交换) 检查点(如果您使用的是实验性检查点/恢复功能)
【讨论】:
从链接中引用基本信息总是一个好主意(以防链接失效;并为未来的读者提供一个“起点”来掌握链接上所说的内容。)从该链接:““大小”信息显示了用于每个可写层的数据量(在磁盘上)容器。“虚拟大小”是用于容器和可写层使用的只读图像数据的磁盘空间总量。” 我刚刚注意到链接是关于 container 的大小,而问题是关于 image 的大小。我不知道容器和图像的大小/虚拟大小的含义是否完全相同。坦率地说,我什至不知道“虚拟大小”对于 图像 意味着什么,除非它意味着“由该图像制成的容器将具有的虚拟大小”。也就是说,容器内访问的内存空间大小,是只读图像数据(由该图像的所有实例共享)加上容器的可写层(每个实例都需要自己的)的总和。 所以磁盘空间是共享的,但是 RAM 呢?每个进程堆栈都有自己的底层程序副本? @geige v【参考方案2】:“虚拟”大小和常规大小并不神秘,但您应该记住,图像具有中间图像或“缓存”(如果您愿意)。所以图像的虚拟大小就是你看到的那个:
docker images
并且一个图像的图像磁盘大小是与该图像关联的所有缓存图像的总和,您可以看到:
docker images -a
【讨论】:
不幸的是,这个答案将中间层的主题与虚拟与非虚拟大小混为一谈。恕我直言,这只会增加主题的混乱,最好由作者删除。 (它已经被其他人否决了;我只是就它为什么没用发表我的看法。)以上是关于docker 镜像的大小和虚拟大小有啥区别?的主要内容,如果未能解决你的问题,请参考以下文章