2016-09-02 80 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