為了很好的使用存儲引擎,必須明白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.
Docker 存儲引擎負(fù)責(zé)堆放這些layers,然后提供一個統(tǒng)一的展示。
當(dāng)創(chuàng)建一個新的容器,將底層堆的最上層設(shè)置成可寫,通常這層叫做“containers layer”
對正在運行的容器做所有的修改,比如創(chuàng)建新文件,修改已存在的文件,刪除文件。這些操作都是在可寫的容器層。
下圖,展示了以Ubuntu15.04為基礎(chǔ)的容器。
Containers and layers
容器和鏡像主要的不同就是,頂層可寫層。所有的修改操作都是存儲在這個可寫層的。
當(dāng)容器被刪除的時候這個可寫層也就被刪除了。而底層的image沒有改變。
因為每個容器有自己的可寫容器層,所有的更改都存儲在這容器層中,這意味著多個容器可以同時使用同一個底層image。
下圖顯示多個容器共用Ubuntu15.04image:
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 磁盤空間使用以及容器的啟動