我无法理解如何使用存储卷来影响我的磁盘空间使用情况。
我有图像A这是一个基本图像,并附带了我的应用程序所需的许多实用程序。我有应用程序B和C,它们是从基础映像A构建的映像。它们安装不同的语言来运行我的两个不同的应用程序。图像A为300MB,B和C均为300MB。
如果我创建应用A和B的10个实例,将使用多少磁盘空间?
另外假设我将NFS共享安装到所有容器,容器内的任何应用程序/进程只会将应用程序数据,日志等写入已安装的nfs共享,因此看起来不会发生写入容器。挂载点是/ var / www / html我的磁盘使用情况是什么样的?
正如我目前在第一种情况下理解的那样,我的磁盘使用率将是(300MB用于基本图像+ 600mb用于构建在它上面的两个app图像因此900mb。我假设基本图像将被共享如果从应用程序映像B和C创建了任何容器,并且每个容器在清除之前都会写入100mb数据。那么我的总磁盘使用量将是900mb + 100mb(写入磁盘的净数据)*容器数量?
我如何理解这一点?
答案 0 :(得分:2)
分层文件系统将重用父图像中的图层,因此如果图像A为300MB且应用程序B和C均为300MB,那么实际上这些应用程序容器正在添加近0个磁盘空间,重用父图像的整个内容。由于所有数据都存储在外部,并且没有写入容器的本地RW文件系统,因此您可以根据需要调整其中的任意数量,并且只使用300MB的磁盘。
如果这些应用中的每一个实际上添加 300MB,那么300MB与父和其他应用容器不同(docker使用缓存,如果他们运行,可以允许每个应用容器从另一个应用容器重用相同的命令),然后你最终得到的每个图像显示为600MB,而实际使用的磁盘将是900MB,父母为300MB,每个应用程序图像为300MB。
在该容器将文件写入本地卷或容器的RW层之前,旋转每个容器不会添加到已用磁盘空间。
了解这一点进入了分层文件系统设计。图像可以由多个图层组成,每个图层都创建一次并且可以被其他图像重用,所有内容都存储为对哈希的引用,并且只有当不再有对哈希的引用时,docker才会删除{ {1}}。
当您将图像转换为容器(docker rmi
甚至docker run
)时,图像内容将作为只读层安装,容器的RW层安装在顶部,任何卷安装在分层文件系统的顶部。卷外部的读取将通过这些层,直到它与文件达到一个(或文件上的某些其他修改,如删除)。因此,如果文件未被修改,则从其中一个图像层读取,但如果您在RW层中创建它,则读取将拉回来。这导致图像的概念是不可变的,而容器可以在容器的整个生命周期中存储它们自己的变化。您可以在容器上运行docker create
以对其RW层进行了哪些更改。此差异是您在构建的每个步骤或docker diff
上存储到图像层中的差异。