為了很好的使用存儲(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.
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ǔ)的容器。
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:
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)