Linux 分层文件系统和卷装载

Linux 分层文件系统和卷装载,linux,docker,containers,lxc,Linux,Docker,Containers,Lxc,我很难理解使用卷存储将如何影响磁盘空间的使用 我有一个图像A,它是一个基本图像,并带有我的应用程序需要的许多实用程序。我有应用程序B和C,它们是从基本图像A构建的图像。它们安装不同的语言来运行我的两个不同的应用程序。图像A为300MB,B和C各为300MB 如果我创建10个应用程序A和B实例,将使用多少磁盘空间 另外,假设我正在将NFS共享装载到所有容器中,容器中的任何应用程序/进程都只会将应用程序数据、日志等写入装载的NFS共享,因此容器中似乎没有发生写入操作。挂载点是/var/www/htm

我很难理解使用卷存储将如何影响磁盘空间的使用

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

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

另外,假设我正在将NFS共享装载到所有容器中,容器中的任何应用程序/进程都只会将应用程序数据、日志等写入装载的NFS共享,因此容器中似乎没有发生写入操作。挂载点是/var/www/html我的磁盘使用情况如何

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


我如何理解这一点?

分层文件系统将重用来自父映像的层,因此,如果映像A为300MB,应用程序B和C各为300MB,那么实际上这些应用程序容器将添加近0个磁盘空间,重用父映像的全部内容。所有数据都存储在外部,并且不会写入容器的localRW文件系统,您可以根据需要对其中的任意多个文件进行加速,并且只使用300MB的磁盘

如果这些应用程序中的每一个都实际添加了300MB,并且这些300MB与父应用程序容器和其他应用程序容器不同(docker使用缓存,如果每个应用程序容器运行相同的命令,则允许它们从另一个应用程序容器重新使用),则每个映像显示为600MB,而实际使用的磁盘将为900MB,父映像为300MB,每个应用程序映像为300MB

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

理解这一点就进入了分层文件系统的设计。映像可能由多个层组成,每个层创建一次并可被其他映像重用,所有内容都存储为对散列的引用,只有当不再引用散列时,docker才会在
docker rmi
上删除该层


将图像转换为容器时(使用
docker run
甚至
docker create
),映像内容作为只读层安装,容器的RW层安装在顶部,任何卷都安装在分层文件系统的顶部。卷外部的读取将通过这些层,直到它与文件(或对文件的某些其他修改,如删除)一起到达一个层。因此,如果文件未被修改,它将从其中一个图像层读取,但如果在RW层中创建它,则读取将收回。这导致图像的概念是不可变的,而容器可以在容器的整个生命周期中存储各自的更改。您可以在容器上运行
docker diff
,以查看更改内容这个差异就是你在构建的每一步,或者在docker commit上存储到映像层的差异,分层的文件系统将重用父映像中的层,因此如果映像a是300MB,应用B和C都是300MB,那么实际上这些应用容器增加了近0个磁盘空间,重用了e父映像的全部内容。由于所有数据都存储在外部,并且没有写入容器的本地RW文件系统,您可以根据需要对其中的任意多个文件进行加速,并且只使用300MB的磁盘

如果这些应用程序中的每一个都实际添加了300MB,并且这些300MB与父应用程序容器和其他应用程序容器不同(docker使用缓存,如果每个应用程序容器运行相同的命令,则允许它们从另一个应用程序容器重新使用),则每个映像显示为600MB,而实际使用的磁盘将为900MB,父映像为300MB,每个应用程序映像为300MB

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

理解这一点就进入了分层文件系统的设计。映像可能由多个层组成,每个层创建一次并可被其他映像重用,所有内容都存储为对散列的引用,只有当不再引用散列时,docker才会在
docker rmi
上删除该层


将图像转换为容器时(使用
docker run
甚至
docker create
),映像内容作为只读层安装,容器的RW层安装在顶部,任何卷都安装在分层文件系统的顶部。卷外部的读取将通过这些层,直到它与文件(或对文件的某些其他修改,如删除)一起到达一个层。因此,如果文件未被修改,它将从其中一个图像层读取,但如果在RW层中创建它,则读取将收回。这导致图像的概念是不可变的,而容器可以在容器的整个生命周期中存储各自的更改。您可以在容器上运行
docker diff
,以查看更改内容已经制作到其RW层。此差异是您在构建的每个步骤或在
docker提交上存储到图像层的内容。谢谢。因此,有了用于写入的网络文件服务器,我可以在我的机器上运行无限的容器?无限的,只要每个进程有无限的内存。将有一些理论上的限制它位于文件句柄和网络地址空间上,但在达到这些句柄和地址空间之前,内存或CPU容量将耗尽。看起来太好了,难以置信:-)。谢谢。