Docker的存儲(chǔ)驅(qū)動(dòng)

一、原理說明

寫時(shí)復(fù)制(CoW)

CoW就是copy-on-write,表示只在需要寫時(shí)才去復(fù)制,這個(gè)是針對(duì)已有文件的修改場(chǎng)景。比如基于一個(gè)image啟動(dòng)多個(gè)Container,如果為每個(gè)Container都去分配一個(gè)image一樣的文件系統(tǒng),那么將會(huì)占用大量的磁盤空間。而CoW技術(shù)可以讓所有的容器共享image的文件系統(tǒng),所有數(shù)據(jù)都從image中讀取,只有當(dāng)要對(duì)文件進(jìn)行寫操作時(shí),才從image里把要寫的文件復(fù)制到自己的文件系統(tǒng)進(jìn)行修改。所以無(wú)論有多少個(gè)容器共享同一個(gè)image,所做的寫操作都是對(duì)從image中復(fù)制到自己的文件系統(tǒng)中的復(fù)本上進(jìn)行,并不會(huì)修改image的源文件,且多個(gè)容器操作同一個(gè)文件,會(huì)在每個(gè)容器的文件系統(tǒng)里生成一個(gè)復(fù)本,每個(gè)容器修改的都是自己的復(fù)本,相互隔離,相互不影響。使用CoW可以有效的提高磁盤的利用率。

了解了寫時(shí)復(fù)制,就應(yīng)該注意一個(gè)問題:如果第一次修改鏡像層內(nèi)包含的文件,文件的size很大.會(huì)造成大量的磁盤IO的開銷.所以不建議將需要修改的大文件,集成到鏡像內(nèi).可以采用數(shù)據(jù)卷的方式.

用時(shí)分配(allocate-on-demand)

用時(shí)分配是用在原本沒有這個(gè)文件的場(chǎng)景,只有在要新寫入一個(gè)文件時(shí)才分配空間,這樣可以提高存儲(chǔ)資源的利用率。比如啟動(dòng)一個(gè)容器,并不會(huì)為這個(gè)容器預(yù)分配一些磁盤空間,而是當(dāng)有新文件寫入時(shí),才按需分配新空間。

Docker存儲(chǔ)驅(qū)動(dòng)的作用

將這些分層的鏡像文件堆疊起來,并且提供統(tǒng)一的視圖.使container的文件系統(tǒng)看上去和我們普通的文件系統(tǒng)沒什么區(qū)別。
當(dāng)創(chuàng)建一個(gè)新的容器的時(shí)候,實(shí)際上是在鏡像的分層上新添加了一層container layer(容器層).之后所有對(duì)容器產(chǎn)生的修改,實(shí)際都只影響這一層。

注意
容器層:讀寫層(可寫層)
鏡像層:只讀層

二、驅(qū)動(dòng)模式

  • 目前,Docker支持OverlayFS,AUFS,Btrfs,Device Mapper,VFS,ZFS等存儲(chǔ)驅(qū)動(dòng)
  • docker的存儲(chǔ)驅(qū)動(dòng)目前并沒有一個(gè)通用的,完美的,適用于所有環(huán)境的存儲(chǔ)驅(qū)動(dòng).所以需要根據(jù)自己的環(huán)境來有所選擇.
  • 存儲(chǔ)驅(qū)動(dòng)在不斷的改進(jìn)與發(fā)展
  • 如果從穩(wěn)定性上的考量,在安裝docker的時(shí)候會(huì)默認(rèn)根據(jù)你的系統(tǒng)環(huán)境配置選擇一個(gè)存儲(chǔ)驅(qū)動(dòng).通常來說使用這個(gè)默認(rèn)的驅(qū)動(dòng)將減少你遇到bug的機(jī)會(huì).
  • 如果你的團(tuán)隊(duì)使用過RHEL及其相關(guān)分支,你可能有關(guān)于LVM和Device Mapper的經(jīng)驗(yàn).這時(shí)建議你使用devicemapper存儲(chǔ)驅(qū)動(dòng).
image.png
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

友情鏈接更多精彩內(nèi)容