首先來張圖了解Docker的組成
重要
Docker在啟動容器的時候,需要創建文件系統,為rootfs提供掛載點。最初Docker僅能在支持Aufs文件系統的Linux發行版上運行,但是由於Aufs未能加入Linux內核,為了尋求兼容性、擴展性,Docker在內部通過graphdriver機制這種可擴展的方式來實現對不同文件系統的支持。目前,Docker支持Aufs,Devicemapper,Btrfs和Vfs四種文件系統。
Docker鏡像
典型的Linux文件系統由bootfs和rootfs兩部分組成,bootfs(boot file system)主要包含 bootloader和kernel,bootloader主要是引導加載kernel,當kernel被加載到內存中后 bootfs就被umount了。 rootfs (root file system) 包含的就是典型 Linux 系統中的/dev,/proc,/bin,/etc等標准目錄和文件。
Docker容器是建立在Aufs基礎上的,Aufs(以前稱之為Another Union FS,后來絕不不夠高大上,更名為Advanced Union FS)是一種Union FS, 簡單來說就是支持將不同的目錄掛載到同一個虛擬文件系統下,並實現一種layer的概念。Aufs將掛載到同一虛擬文件系統下的多個目錄分別設置成read-only,read-write以及whiteout-able權限,對read-only目錄只能讀,而寫操作只能實施在read-write目錄中。重點在於,寫操作是在read-only上的一種增量操作,不影響read-only目錄。當掛載目錄的時候要嚴格按照各目錄之間的這種增量關系,將被增量操作的目錄優先於在它基礎上增量操作的目錄掛載,待所有目錄掛載結束了,繼續掛載一個read-write目錄,如此便形成了一種層次結構。
與傳統系統加載的區別
Docker鏡像的典型結構如下圖。
【重點】
傳統的Linux加載bootfs時會先將rootfs設為read-only,然后在系統自檢之后將rootfs從read-only改為read-write,然后我們就可以在rootfs上進行寫和讀的操作了。
但Docker的鏡像卻不是這樣,它在bootfs自檢完畢之后並不會把rootfs的read-only改為read-write。而是利用union mount(UnionFS的一種掛載機制)將一個或多個read-only的rootfs加載到之前的read-only的rootfs層之上。在加載了這么多層的rootfs之后,仍然讓它看起來只像是一個文件系統,在Docker的體系里把union mount的這些read-only的rootfs叫做Docker的鏡像。但是,此時的每一層rootfs都是read-only的,我們此時還不能對其進行操作。當我們創建一個容器,也就是將Docker鏡像進行實例化,系統會在一層或是多層read-only的rootfs之上分配一層空的read-write的rootfs。
【參考】
1.http://www.open-open.com/lib/view/open1440483391763.html 講述在ubuntu下面aufs的實現原理以及實踐
2.http://www.infoq.com/cn/articles/analysis-of-docker-file-system-aufs-and-devicemapper/ Docker基於aufs的實現原理以及二者的細微差別