1. 程式人生 > 實用技巧 >Docker(五)Docker映象講解

Docker(五)Docker映象講解

Docker映象講解

映象概念

映象是一種輕量級、可執行的獨立軟體包,用來打包軟體執行環境和基於執行環境開發的軟體,它包含執行某個軟體所需的所有內容,包括程式碼、執行時、庫、環境變數和配置檔案

Docker映象載入原理

UnionFS(聯合檔案系統)

UnionS(聯合檔案系統):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。


roorfs (root file system),在bootfs之上。包含的就是典型Linux系統中的 /dev ,/proc,/bin ,/etx 等標準的目錄和檔案。rootfs就是各種不同的作業系統發行版。比如Ubuntu,Centos等等。

對於一個精簡的OS,rootfs可以很小,只需要包括最基本的命令、工具和程式庫就可以了,因為底層直接用Host(宿主機)的kernel,自己只需要提供rootfs就行了,由此可見對於不同的Linux發行版,bootfs基本是一致的,rootfs會有差別,因此不同的發行版可以公用bootfs。

對於安裝虛擬機器器的壓縮包都是很大的,而Docker的映象卻很小


分層理解

這樣最大的好處就是資源共享,例如很多個映象都從相同的 Base 映象構建而來,而宿主機只需要在磁碟上保留一份 base 映象,同時記憶體中也只需要載入一份 base 映象,這樣就可以為所有的人容器服務了,而且映象的每一層都可以被共享

理解

所有的 Docker映象都起始於一個基礎映象層,進行修改或增加新的內容時,就會在當前的映象層之上,建立新的映象層。

舉一個簡單的例子,假如基於 Ubuntu linux16.04建立一個新的映象,這就是新映象的第一層;如果在該映象中新增Python包就會在基礎映象層之上建立第二個映象層;如果繼續新增一個安全補丁,就會建立第三個映象層該映象當前已經包含3個映象層,如下圖所示(這只是一個用於演示的很簡單的例子)

在新增額外的映象層的同時,映象始終保持是當前所有映象的組合,理解這一點非常重要。下圖中舉了一個簡單的例子,每個映象層包含3個檔案,而映象包含了來自兩個映象層的6個檔案

上圖中的映象層跟之前圖中的略有區別,主要目的是便於展示檔案。

下圖中展示了一個稍微複雜的三層映象,在外部看來整個映象只有6個檔案,這是因為最上層中的檔案7是檔案5的一個更新版

這種情況下,上層映象層中的檔案覆蓋了底層映象層中的檔案。這樣就使得檔案的更新版本作為一個新映象層新增到映象當中。

Docker通過儲存引擎(新版本採用快照機制)的方式來實現映象層堆疊,並保證多映象層對外屐示為統一的檔案系統

Linux上可用的儲存引擎有AUFS、 Overlay2、 Device Mapper、Btfs以及ZFS 。顧名思義,每種儲存引擎都基於 Linux中對應的檔案系統或者塊裝置技術,並且每種儲存引擎都有其獨有的效能特點。

Docker在 Windows上僅支援 windowsfilter 一種儲存引擎,該引擎基於NTFS檔案系統之上實現了分層和CoW。

下圖展示了與系統顯示相同的三層映象。所有映象層堆併合並,對外提供統一的檢視

特點

Docker映象都是隻讀的,當容器啟動時新的可寫層被載入到映象的頂部,這一層就是我們通常說的容器層,容器之下的都叫映象層

commit 映象

提交映象

docker commit 提交映象

# docker commit [OPTIONS] CONTAINER [REPOSITORY[:TAG]]

Usage:	docker commit [OPTIONS] CONTAINER [REPOSITORY[:TAG]]
Create a new image from a container's changes
Options:
-a, --author string Author (e.g., "John Hannibal Smith <[email protected]>") 作者資訊
-c, --change list Apply Dockerfile instruction to the created image 將Dockerfile指令應用於建立的映像
-m, --message string Commit message 提交的資訊
-p, --pause Pause container during commit (default true) 提交期間暫停容器(預設為true) # 測試
# 進入 tomcat
[[email protected] ~]# docker exec -it 6e9740900ae3 /bin/bash
[email protected]:/usr/local/tomcat# cp -r webapps.dist/* webapps # 將 webapps.dist/* 下的全部內容拷貝
[email protected]:/usr/local/tomcat# cd webapps
[email protected]:/usr/local/tomcat/webapps# ls
ROOT docs examples host-manager manager # 進行提交
[[email protected] ~]# docker commit -a="hewen" -m="tomcat1.0" 6e9740900ae3 tomcat10.0.0:1.0
sha256:5ad9040a94da3c32d7f8c66e3494a6cbce2cce68b501a944c003a174bc513d89
[[email protected] ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
tomcat10.0.0 1.0 5ad9040a94da 6 seconds ago 651MB
elasticsearch 7.8.0 121454ddad72 8 days ago 810MB
redis 6.0.5 235592615444 12 days ago 104MB
tomcat 10.0.0 0d691b180bd5 13 days ago 647MB
nginx 1.19.0 2622e6cca7eb 13 days ago 132MB # 修改後的映象儲存了自己配置的資訊,以後想使用的話可以直接啟動即可