天天看點

Docker(五)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等等。

Docker(五)Docker鏡像講解

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

對于安裝虛拟機的壓縮包都是很大的,而Docker的鏡像卻很小

Docker(五)Docker鏡像講解

分層了解

Docker(五)Docker鏡像講解

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

Docker(五)Docker鏡像講解

了解

所有的 Docker鏡像都起始于一個基礎鏡像層,進行修改或增加新的内容時,就會在目前的鏡像層之上,建立新的鏡像層。

舉一個簡單的例子,假如基于 Ubuntu linux16.04建立一個新的鏡像,這就是新鏡像的第一層;如果在該鏡像中添加Python包就會在基礎鏡像層之上建立第二個鏡像層;如果繼續添加一個安全更新檔,就會建立第三個鏡像層該鏡像目前已經包含3個鏡像層,如下圖所示(這隻是一個用于示範的很簡單的例子)

Docker(五)Docker鏡像講解

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

Docker(五)Docker鏡像講解

上圖中的鏡像層跟之前圖中的略有差別,主要目的是便于展示檔案。

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

Docker(五)Docker鏡像講解

這種情況下,上層鏡像層中的檔案覆寫了底層鏡像層中的檔案。這樣就使得檔案的更新版本作為一個新鏡像層添加到鏡像當中。

Docker通過存儲引擎(新版本采用快照機制)的方式來實作鏡像層堆棧,并保證多鏡像層對外屐示為統一的檔案系統

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

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

下圖展示了與系統顯示相同的三層鏡像。所有鏡像層堆并合并,對外提供統一的視圖

Docker(五)Docker鏡像講解

特點

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 
[root@hwh1 ~]# docker exec -it 6e9740900ae3 /bin/bash
root@6e9740900ae3:/usr/local/tomcat# cp -r webapps.dist/* webapps        # 将 webapps.dist/* 下的全部内容拷貝
root@6e9740900ae3:/usr/local/tomcat# cd webapps
root@6e9740900ae3:/usr/local/tomcat/webapps# ls
ROOT  docs  examples  host-manager  manager

# 進行送出
[root@hwh1 ~]# docker commit -a="hewen" -m="tomcat1.0" 6e9740900ae3 tomcat10.0.0:1.0
sha256:5ad9040a94da3c32d7f8c66e3494a6cbce2cce68b501a944c003a174bc513d89
[root@hwh1 ~]# 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

# 修改後的鏡像儲存了自己配置的資訊,以後想使用的話可以直接啟動即可

           
Docker(五)Docker鏡像講解