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等等。
3.Docker鏡像分層的了解
我們拉去鏡像時,看到的一層層的就是聯合檔案系統!
思考:為什麼Docker鏡像要采用這種分層的結構呢?
最大的好處,我覺得莫過于是資源共享了!
比如有多個鏡像都從相同的Base鏡像建構而來,那麼主控端隻需在磁盤上保留一份base鏡像,
同時記憶體中也隻需要加載一份base鏡像,這樣就可以為所有的容器服務了,
而且鏡像的每一層都可以被共享.
檢視鏡像分層的方式可以通過 docker image inspect 指令!
所有的 Docker 鏡像都起始于一個基礎鏡像層,當進行修改或增加新的内容時 ,就會在目前鏡像層之上,建立新的鏡像層。
舉一個簡單的例子 ,假如基于 Ubuntu Linux 16.04 建立•
一個新的鏡像,這就是新鏡像的第一層;如果在該鏡像中添加 Python包
就會在基礎鏡像層之上建立第二個鏡像層;如果繼續添加一個安全更新檔,就會建立第三個鏡像層。
該鏡像目前已經包含 3個鏡像層,如下圈所示( 這隻是一個用于示範的很簡單的例子)。
在添加額外的鏡像層的同時 ,鏡像始終保持是目前所有鏡像的組合 ,了解這一點非常重要。
下圖中舉了一個簡單的例子,每個鏡像
層包含 3個檔案 ,而鏡像包含了來自兩個鏡像層的6個檔案。
上圖中的鏡像層跟之前圖中的路有差別 ,主要目的是便于展示檔案。
下圖中展示了一個稍微複雜的三層鏡像,在外部石來整個鏡像隻有 6個檔案,這是因為最上層中的檔案?是檔案5的一個更新版
本
這種情況下,上層鏡像層中的檔案愛蓋了底層鏡像層中的檔案。這樣就使得檔案的更新版本作為一個新鏡像層添加到鏡像當中。
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頁面
3.2.5 将修改或者操作後的容器通過commit指令送出為一個新的鏡像
- 送出之前
- 送出了之後
docker commit -a="tww" -m="測試commit指令" 83bc4f2e4870 tomcat_new:1.0
如果你想要儲存目前容器的狀态,就可以通過commit來送出,獲得一個鏡像,
就好比我們以前學習VM時候,快照!