Docker映象講解
映象是什麼?
映象是一種輕量級、可執行的獨立軟體包,用來打包軟體執行環境和基於執行環境開發的軟體,它包含執行某個軟體所需的所有內容,包括程式碼、執行時、庫、環境變數和配置檔案。
所有的應用, 直接打包成docker映象, 就可以直接跑起來!
如何得到映象?
從遠端倉庫下載
朋友拷貝給你
自己製作一個映象Docker File
UnionFS聯合檔案系統
我們下載的時候看到的一層一層就是分層下載!
UnionFS(聯合檔案系統) :Union檔案系統(UnionFS) 是一種分層、輕量級並且高效能的檔案系統, 它支援對檔案系統的修改作為一次提交來一層層的疊加,同時可以將不同目錄掛載到同一個虛擬檔案系統下(unite several directories into a single virtual filesystem) 。Union檔案系統是Docker映象的基礎。映象可以通過分層來進行繼承, 基於基礎映象(沒有父映象) , 可以製作各種具體的應用映象。
特性:一次同時載入多個檔案系統,但從外面看起來,只能看到一個檔案系統,聯合載入會把各層檔案系統疊加起來,這樣最終的 檔案系統會包含所有底層的檔案和目錄 。
Docker映象載入原理
docker的映象實際上由一層一層的檔案系統組成, 這種層級的檔案系統UnionFS。
bootfs(boot file system) 主要包含bootloader和kernel,bootloader主要是引導載入kernel, Linux剛啟動時會載入bootfs檔案系統,在Docker映象的最底層是bootfs。這一層與我們典型的Linux/Unix系統是一樣的, 包含boot載入器和核心。當boot載入完成之後整個核心就都在記憶體中了, 此時記憶體的使用權已由bootfs轉交給核心, 此時系統也會解除安裝bootfs。
rootfs(root file system) ,在bootfs之上。包含的就是典型Linux系統中的/dev,/proc,/bin,/etc等標準目錄和檔案。rootfs就是各種不同的作業系統發行版, 比如Ubuntu, Centos等等。
平時我們安裝進虛擬機器的CentOS都是好幾個G, 為什麼Docker這裡才200M?
對於一個精簡的OS,rootfs可以很小,只需要包含最基本的命令,工具和程式庫就可以了, 因為底層直接用Host的kernel, 自己只需要提供rootfs就可以了。由此可見對於不同的linux發行版, bootfs基本是一致的,rootfs會有差別,因此不同的發行版可以公用 bootfs。
底層引導不變
虛擬機器分鐘級別,容器秒級。
分層的映象
我們可以去下載一個映象,注意觀察下載的日誌輸出,可以看到是一層一層的在下載!
思考:為什麼Docker映象要採用這種分層的結構呢?
最大的好處,莫過於是資源共享!比如有多個映象都從相同的Base映象構建而來,那麼宿主機只需在磁碟上保留一份base映象,同時記憶體中也只需要載入一份base映象,這樣就可以為所有的容器服務了, 而且映象的每一層都可以被共享。
檢視映象分層的方式可以通過docker image inspect命令!
[root@localhost ~]# docker image inspect redis:latest
[
//......
"RootFS": {
"Type": "layers",
"Layers": [
"sha256:d0fe97fa8b8cefdffcef1d62b65aba51a6c87b6679628a2b50fc6a7a579f764c",
"sha256:832f21763c8e6b070314e619ebb9ba62f815580da6d0eaec8a1b080bd01575f7",
"sha256:223b15010c47044b6bab9611c7a322e8da7660a8268949e18edde9c6e3ea3700",
"sha256:6a9976a8f40851f45dc8c68a04b130e90522f46bb7e8403c6e7eb4331674f213",
"sha256:c875a9fc3ec72b140e325e1a1b3b57d299b91811e8288a07c6b788b0d7cba185",
"sha256:d9364cb75b1a364fbcb97b2f51332fc012ae0321e18c3fd3811f5e5a9f8a2d0e"
]
},
"Metadata": {
"LastTagTime": "0001-01-01T00:00:00Z"
}
}
]
理解:
所有的Docker映象都起始於一個基礎映象層,當進行修改或增加新的內容時,就會在當前映象層之上建立新的映象層。舉一個簡單的例子,假如基於Ubuntu Linux 16.04建立一個新的映象,這就是新映象的第一層;如果在該映象中新增Python包就會在基礎映象層之上建立第二個映象層;如果繼續新增一個安全補丁,就會建立第三個映象層。該映象當前已經包含3個映象層,如下圖所示(這只是一個用於演示的很簡單的例子)。
在新增額外的映象層的同時,映象始終保持是當前所有映象的組合,理解這一點非常重要。下圖中舉了一個簡單的例子,每個映象層包含3個檔案,而映象包含了來自兩個映象層的6個檔案。
上圖中的映象層跟之前圖中的略有區別,主要目的是便於展示檔案。 下圖中展示了一個稍微複雜的三層映象,在外部看來整個映象只有6個檔案,這是因為最上層中的檔案7是檔案5的一個更新版本。
這種情況下,上層映象層中的檔案覆蓋了底層映象層中的檔案。這樣就使得檔案的更新版本作為一個新映象層新增到映象當中。 Docker通過儲存引擎(新版本採用快照機制) 的方式來實現映象層堆疊, 並保證多映象層對外展示為統一的檔案系統。 Linux上可用的儲存引擎有AUFS、 Overlay2、Device Mapper、Btrfs以及ZFS。顧名思義, 每種儲存引擎都基於Linux中對應的檔案系統或者塊裝置技術,並且每種儲存引擎都有其獨有的效能特點。 Docker在Windows上僅支援windows filter一種儲存引擎, 該引擎基於NTFS檔案系統之上實現了分層和CoW[1] 。 下圖展示了與系統顯示相同的三層映象。所有映象層堆疊併合並,對外提供統一的檢視。
特點
Docker映象都是隻讀的, 當容器啟動時, 一個新的可寫層被載入到映象的頂部 這一層就是我們通常說的容器層,容器之下的都叫映象層!
注:所有的操作都是基於容器層。
如何提交一個自己的映象?