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

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

 

Images and layers


 

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

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

下圖,Ubuntu15.04 image包含了4 個堆image layers.

iOS培訓(xùn),Swift培訓(xùn),蘋果開發(fā)培訓(xùn),移動開發(fā)培訓(xùn)

 

iOS培訓(xùn),Swift培訓(xùn),蘋果開發(fā)培訓(xùn),移動開發(fā)培訓(xùn)

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

 

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

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

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

iOS培訓(xùn),Swift培訓(xùn),蘋果開發(fā)培訓(xùn),移動開發(fā)培訓(xùn)

 iOS培訓(xùn),Swift培訓(xùn),蘋果開發(fā)培訓(xùn),移動開發(fā)培訓(xùn)

 

Containers and layers


 

容器和鏡像主要的不同就是,頂層可寫層。所有的修改操作都是存儲在這個可寫層的。

當(dāng)容器被刪除的時候這個可寫層也就被刪除了。而底層的image沒有改變。

 

因為每個容器有自己的可寫容器層,所有的更改都存儲在這容器層中,這意味著多個容器可以同時使用同一個底層image。

下圖顯示多個容器共用Ubuntu15.04image:

iOS培訓(xùn),Swift培訓(xùn),蘋果開發(fā)培訓(xùn),移動開發(fā)培訓(xùn)

 

iOS培訓(xùn),Swift培訓(xùn),蘋果開發(fā)培訓(xùn),移動開發(fā)培訓(xùn)

docker存儲引擎負(fù)責(zé)開啟和管理 image 層 和可寫的container 層。

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

 

Copy-on-write 策略


 

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

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

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

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


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

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

 

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