2016-09-02 78 views
0

我无法理解如何使用存储卷来影响我的磁盘空间使用情况。分层文件系统和卷安装

我有图像A,它是一个基本的图像,并附带了我的应用程序需要的很多实用程序。我有基本图像A构建的应用程序B和C,它们安装不同的语言来运行我的两个不同的应用程序。图像A是300MB,B和C每个是300MB。

如果我创建10个应用程序A和B的实例将使用多少磁盘空间?

另外,假设我将NFS共享挂载到所有容器,容器中的任何应用程序/进程都只将应用程序数据,日志等写入挂载的nfs共享,所以似乎不会写入容器。装载点是/ var/www/html我的磁盘使用情况如何?

正如我目前所了解的,在第一种情况下,我的磁盘使用率将会是(基本图像为300mb,构建于其上的两个应用程序图像为600mb,我假设基础图像将被共享。如果任何容器是从应用程序映像B和C创建的,并且它们每个在清除之前写入100mb数据,那么我的总磁盘使用量将为900mb + 100mb(写入磁盘的净数据)*容器数量。我是否明白这一点?

回答

2

分层文件系统将重用父图像中的图层,因此如果图像A是300MB,应用程序B和C每个都是300MB,那么实际上这些应用程序容器正在添加接近0的磁盘空间,reusi整个父图像的内容。由于所有数据都是外部存储的,并且不会写入容器的本地RW文件系统,因此可以根据需要启动尽可能多的数据,并且只使用300MB的磁盘。

如果每个这些应用程序实际上是添加 300MB,和那些300MB是从父和其他应用的容器不同(搬运工使用缓存,可能允许如果他们跑相同的命令每个应用程序容器从所述其他重用) ,那么最终每个图像显示为600MB,而实际使用的磁盘将为900MB,父级为300MB,每个应用图像为300MB。

旋转每个容器不会添加到已使用的磁盘空间,直到该容器将文件写入本地卷或容器的RW层。

了解这一点进入分层文件系统设计。该图像可能由多个图层组成,每个图层都会创建一次,并且可以被其他图像重复使用,所有内容都会存储为哈希引用,并且只有在没有更多哈希引用时,docker才会移除docker rmi上的该图层。

当打开一个图像到容器(具有docker run甚至docker create),图像内容被安装为只读层,用RW层为安装在顶部的容器,和任何卷装在层状的顶文件系统。卷外部的读取会穿过层,直到达到与文件相同的位置(或文件上的其他修改,如删除)。所以如果文件没有被修改,它会从其中一个图像层读取,但是如果你在RW层创建它,你的读取会将其拉回。这导致图像的概念是不可变的,而容器可以在容器的整个生命周期中存储它们自己的变化。您可以在容器上运行docker diff以了解对其RW层进行了哪些更改。该差异是您在构建的每个步骤或在docker commit上存储到图像图层中的内容。

+0

谢谢。因此,通过网络文件服务器进行写入,我可以在我的计算机上运行无限量的容器? – Jonathan

+0

无限制只要你有每个进程无限的内存。文件句柄和网络地址空间将会有一些理论上的限制,但在达到这些之前,您将耗尽内存或CPU容量。 – BMitch

+0

看起来太好了,真的:-)。谢谢。应用程序A和B是不同的图像,因此总数将为900MB。 – Jonathan