天天看點

Docker之路(5.Docker鏡像學習、鏡像加載原理、鏡像分層原理、通過commit送出鏡像)

1.鏡像是什麼

鏡像是一種輕量級.可執行的獨立軟體包,用來打包軟體運作環境和基于運作環境開發的軟體,它包含運作某個軟體所需的所有内客,

包活代碼、運作時、庫、環境變量和配置檔案。

所有的應用,直接打包docker鏡像,就可以直接跑起來
如何得到鏡像:
  • 從遠端倉庫下載下傳
  • 朋友同僚拷貝給你
  • 自己制作一個鏡像DockerFile

2.Docker鏡像加載原理

2.1 UnionFS( 聯合檔案系統)

UnionFS ( 聯合檔案系統):Union檔案系統( UnionFS)是一種分層、輕量級并且高性能的檔案系統,它支援對檔案系統的修改

作為一次送出來一層層的疊加,同時可以将不同目錄挂載到同一

個虛拟檔案系統下(unite several directories into a single virtual

filesystem)。

Union 檔案系統是 Docker 鏡像的基礎。鏡像可以通過分層來進行繼承,基于基礎鏡像(沒有父鏡像),可以制作各

種具體的應用鏡像。

特性:一次同時加載多個檔案系統,但從外面看起來 ,隻能看到一個檔案系統,聯合加載會把各層檔案系統疊加起來 ,這樣最終的

檔案系統會包含所有底層的檔案和目錄

2.2 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等等。

Docker之路(5.Docker鏡像學習、鏡像加載原理、鏡像分層原理、通過commit送出鏡像)

3.Docker鏡像分層的了解

我們拉去鏡像時,看到的一層層的就是聯合檔案系統!
Docker之路(5.Docker鏡像學習、鏡像加載原理、鏡像分層原理、通過commit送出鏡像)

思考:為什麼Docker鏡像要采用這種分層的結構呢?

最大的好處,我覺得莫過于是資源共享了!

比如有多個鏡像都從相同的Base鏡像建構而來,那麼主控端隻需在磁盤上保留一份base鏡像,

同時記憶體中也隻需要加載一份base鏡像,這樣就可以為所有的容器服務了,

而且鏡像的每一層都可以被共享.

檢視鏡像分層的方式可以通過 docker image inspect 指令!

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

舉一個簡單的例子 ,假如基于 Ubuntu Linux 16.04 建立•

一個新的鏡像,這就是新鏡像的第一層;如果在該鏡像中添加 Python包

就會在基礎鏡像層之上建立第二個鏡像層;如果繼續添加一個安全更新檔,就會建立第三個鏡像層。

該鏡像目前已經包含 3個鏡像層,如下圈所示( 這隻是一個用于示範的很簡單的例子)。

Docker之路(5.Docker鏡像學習、鏡像加載原理、鏡像分層原理、通過commit送出鏡像)

在添加額外的鏡像層的同時 ,鏡像始終保持是目前所有鏡像的組合 ,了解這一點非常重要。

下圖中舉了一個簡單的例子,每個鏡像

層包含 3個檔案 ,而鏡像包含了來自兩個鏡像層的6個檔案。

Docker之路(5.Docker鏡像學習、鏡像加載原理、鏡像分層原理、通過commit送出鏡像)

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

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

Docker之路(5.Docker鏡像學習、鏡像加載原理、鏡像分層原理、通過commit送出鏡像)

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

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

Linux 上可用的存儲引擎有 AUFS、Overlay2、Device Mapper、Btrfs 以及 ZFS。顧名思義,每種存儲引擎都基于 Linux中對應的

檔案系統或者塊裝置技術,并且每種存儲引擎都有其獨有的性能特點。

Docker鏡像都是隻讀的,當容器啟動時,一個新的可寫層被加載到鏡像的頁部!

這一層就是我們通常說的容器層,容器之下的都叫鏡像層!

3. commit送出鏡像

3.1 commit指令格式

3.2 commit測試,使用tomcat測試

3.2.1 啟動一個預設的tomcat

docker pull tomact
           
docker run -d --name tomcat01 -p 3355:8080 tomcat
           

3.2.2 發現這個預設的tomcat 是沒有webapps應用,鏡像的原因,官方的預設 webapps下面是沒有檔案的!

3.2.3 進入tomcat容器,将檔案拷貝

docker exec -it tomcat01 /bin/bash
           
cp -r webapps.dist/* webapps/
           

3.2.4 端口暴露出去後,檢視tomcat頁面

Docker之路(5.Docker鏡像學習、鏡像加載原理、鏡像分層原理、通過commit送出鏡像)

3.2.5 将修改或者操作後的容器通過commit指令送出為一個新的鏡像

  • 送出之前
    Docker之路(5.Docker鏡像學習、鏡像加載原理、鏡像分層原理、通過commit送出鏡像)
  • 送出了之後
docker commit -a="tww" -m="測試commit指令" 83bc4f2e4870 tomcat_new:1.0
           
Docker之路(5.Docker鏡像學習、鏡像加載原理、鏡像分層原理、通過commit送出鏡像)
Docker之路(5.Docker鏡像學習、鏡像加載原理、鏡像分層原理、通過commit送出鏡像)

如果你想要儲存目前容器的狀态,就可以通過commit來送出,獲得一個鏡像,

就好比我們以前學習VM時候,快照!

繼續閱讀