2017-04-11 18 views
1

考慮Docker的聯盟文件系統,任何更改實際上都會在當前圖像(最頂層)上執行,而不是先前的;問題是爲什麼這些層不被Docker破壞並且只是隱藏起來?有什麼特別的理由嗎?爲什麼Docker不會銷燬隱藏層?

+0

你能說清楚「隱藏層」是什麼意思嗎? – Matt

+0

爲了理解什麼是Docker卷,我們首先需要明確Docker中文件系統的正常工作方式。Docker鏡像以一系列只讀圖層的形式存儲。當我們啓動一個容器時,Docker將獲取只讀圖像並在頂部添加一個讀寫圖層。如果正在運行的容器修改了現有文件,則將該文件從底層只讀層複製到應用更改的最頂層讀寫層。讀寫層中的版本隱藏底層文件,但不會銷燬它 - 它仍然存在於底層。 – Vennesa

+0

來自:http://container-solutions.com/understanding-volumes-docker/ – Vennesa

回答

2

緩存

通過單獨保存每一層,碼頭工人可以緩存結果後來再使用它,如果它不被任何先前的改變無效。

使得對於更快的構建,而較小的過所有文件系統中使用時具有的多個圖像從相同的基本圖像

+0

謝謝,只是關於重新使用它們的問題;以前的圖層不會變成只讀嗎?我的意思是我可以編輯三層的Dockerfile嗎?思考類似版本控制系統的東西...... – Vennesa

+1

@Vennesa,如果你編輯了三層的Dockerfile,那麼它和它的所有東西都會有一個新的散列,因此會產生一個新的標識 - 如果這個標識沒有被強制執行,改變了與先前存在的身份關聯的價值,你會對兒童狀態產生幾乎不可預知的副作用,並且你將失去身份引用單一具體事物的能力。如果你熟悉git的樹如何包含所有父提交的哈希值,那麼它的概念就非常相似。 –

+1

另外,你可以找到「免費」的東西,可以安全地重複使用以及不能使用這種策略:如果你有一個存儲狀態的父項和它的Dockerfile的散列,那麼你知道它的值與那些輸入相符。 –

1

泊塢是建立在AUFS其是聯合文件系統建立。

圖像通過AUFS層疊在彼此的頂部上的變化(因爲隨後的其它方法已經被添加)

典型的構建將RUN東西,產生了一些數據,並將其保存在一個層中產生。

RUN touch a -- L1  a 
RUN touch b -- L2   b 
RUN touch c -- L3   c 

每層只存儲它自己的一組更改。

這些AUFS層的總和安裝在每個層的頂部,以成爲容器的底層虛擬文件系統。 「圖像」只是底層數據的一個視圖。

圖像本身不存儲任何數據。它只引用存儲數據的圖層。

*image view    a b c 
L3       c 
L2      b 
L1      a 

然後在所有這些層上進行容器更改。如果我需要修改任何現有數據,將新數據添加到其層中,或者「移除」刪除對數據的引用的數據,而不是基礎層中的實際數據,則從適當的層複製任何現有數據。

如果我是修改一個文件,創建一個文件,並刪除文件

echo test >> a 
touch d 
rm c 

該層看起來像:

Lcontainer    a * d 
L3       c 
L2      b 
L1      a 

如果你破壞下層的一個,呈現給容器的視圖將丟失該數據。

*image view    a c 
L3       c 
L1      a 

作爲Derick Bailey mentions這允許一些巧妙圖像生成時的高速緩存,其允許層圖像之間被共享,如果完全相同的層被再次使用。這通常是在您構建FROM現有圖像時。

較新的存儲驅動程序,如decivemapperzfs實現相同的策略,但是在塊級別爲每個層使用文件系統快照或克隆。與底層/快照保持不變的磁盤塊將從原始圖層/快照中讀取。容器層/快照將指針保持爲原始數據,直到它被更改或刪除。

+0

很酷的例子。謝謝 – Vennesa