為了很好的使用存儲(chǔ)引擎,必須明白Dcoker是如何創(chuàng)建和存儲(chǔ)images的。

然后要明白這些images是如何讓containers使用的。最后簡(jiǎn)短介紹一些images和containers操作。

 

Images and layers


 

每個(gè)Docker image都會(huì)參照只讀列表里的layers,這些layers代表不同的文件系統(tǒng)。

layers被堆放在頂端,以形成容器根文件系統(tǒng)的基礎(chǔ)。

下圖,Ubuntu15.04 image包含了4 個(gè)堆image layers.

iOS培訓(xùn),Swift培訓(xùn),蘋(píng)果開(kāi)發(fā)培訓(xùn),移動(dòng)開(kāi)發(fā)培訓(xùn)

 

iOS培訓(xùn),Swift培訓(xùn),蘋(píng)果開(kāi)發(fā)培訓(xùn),移動(dòng)開(kāi)發(fā)培訓(xùn)

Docker 存儲(chǔ)引擎負(fù)責(zé)堆放這些layers,然后提供一個(gè)統(tǒng)一的展示。

 

當(dāng)創(chuàng)建一個(gè)新的容器,將底層堆的最上層設(shè)置成可寫(xiě),通常這層叫做“containers layer”

對(duì)正在運(yùn)行的容器做所有的修改,比如創(chuàng)建新文件,修改已存在的文件,刪除文件。這些操作都是在可寫(xiě)的容器層。

下圖,展示了以Ubuntu15.04為基礎(chǔ)的容器。

iOS培訓(xùn),Swift培訓(xùn),蘋(píng)果開(kāi)發(fā)培訓(xùn),移動(dòng)開(kāi)發(fā)培訓(xùn)

 iOS培訓(xùn),Swift培訓(xùn),蘋(píng)果開(kāi)發(fā)培訓(xùn),移動(dòng)開(kāi)發(fā)培訓(xùn)

 

Containers and layers


 

容器和鏡像主要的不同就是,頂層可寫(xiě)層。所有的修改操作都是存儲(chǔ)在這個(gè)可寫(xiě)層的。

當(dāng)容器被刪除的時(shí)候這個(gè)可寫(xiě)層也就被刪除了。而底層的image沒(méi)有改變。

 

因?yàn)槊總€(gè)容器有自己的可寫(xiě)容器層,所有的更改都存儲(chǔ)在這容器層中,這意味著多個(gè)容器可以同時(shí)使用同一個(gè)底層image。

下圖顯示多個(gè)容器共用Ubuntu15.04image:

iOS培訓(xùn),Swift培訓(xùn),蘋(píng)果開(kāi)發(fā)培訓(xùn),移動(dòng)開(kāi)發(fā)培訓(xùn)

 

iOS培訓(xùn),Swift培訓(xùn),蘋(píng)果開(kāi)發(fā)培訓(xùn),移動(dòng)開(kāi)發(fā)培訓(xùn)

docker存儲(chǔ)引擎負(fù)責(zé)開(kāi)啟和管理 image 層 和可寫(xiě)的container 層。

存儲(chǔ)引擎的兩個(gè)關(guān)鍵技術(shù):堆棧image層和copy-on-write.

 

Copy-on-write 策略


 

共享是提升資源利用率的很好途徑。

copy-on-write是個(gè)很想共享和復(fù)制的策略。

  • 需要相同數(shù)據(jù)的系統(tǒng)進(jìn)程共享該數(shù)據(jù)的同一實(shí)例,而不是擁有自己的副本。

  • 如果一個(gè)進(jìn)程需要修改和寫(xiě)數(shù)據(jù),操作系統(tǒng)會(huì)給這個(gè)進(jìn)程復(fù)制需要的數(shù)據(jù)給它使用。


    • 只有需要寫(xiě)數(shù)據(jù)的進(jìn)程才有權(quán)訪問(wèn)復(fù)制的數(shù)據(jù)。

  • 其他所有的進(jìn)程繼續(xù)使用原共享數(shù)據(jù)

 

docker在image和containers中都是用了copy-on-write技術(shù)。CoW策略優(yōu)化了image 磁盤(pán)空間使用以及容器的啟動(dòng)

網(wǎng)友評(píng)論