Docker 鏡像
- Docker鏡像是什么
- Docker鏡像加載原理
- 聯合檔案系統(UnionFS)
- 鏡像加載原理
- 鏡像分成理解
- Commit鏡像
- 鏡像的總結
Docker鏡像是什么
- Docker 容器的運行是基于宿主機的內核,通過linux的namespaces來實作隔離,相對于虛擬機而言降低了硬體資源的性能損耗,且具備一定程度上的應用隔離效果,
- 鏡像是一種輕量級,可執行的獨立軟體包,用來打包軟體運行環境和基于運行環境開發的軟體,它包含運行某個軟體所需的所有內容,包括代碼、運行時、庫、環境變數和組態檔,
- 通過最小化的鏡像方式運行docker 容器,相對于虛擬機而言大幅度降低非生產力行程的資源消耗,
- 所有應用,直接打包成docker鏡像,就可以在其他服務器上直接運行起來!
- Docker 客戶端啟動一個容器時,通過TCP或者unix socket連接docker daemon,如果需要啟動的容器鏡像本地不存在,則從registry來拉取到本地,然后根據傳遞的CMD或者默認的CMD來啟動容器,

Docker鏡像加載原理
聯合檔案系統(UnionFS)
- UnionFS( 聯合檔案系統) : Union檔案系統(UnionFS )是一種分層、輕量級并且高性能的檔案系統,它支持對檔案系統的修改作為一次提交來一層層的疊加,同時可以將不同目錄掛載到同一個虛擬檔案系統下(unite several directories into a single virtualfilesystem),
- Union檔案系統是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等等,

- 一開始內核里什么都沒有,操作一個命令下載debian
- 安裝一個emacs,就在內核上面加了一層images
- 安裝一個apache,又在上面再加一層
- 下面每一層都是公用的
Docker里的centos的大小才200m
- 因為對于精簡的OS,rootfs可以很小,只需要包含最基本的命令,工具和程式庫就可以了,因為底層直接用Host的kernel,自己只需要提供rootfs就可以了,由此可見對于不同的linux發行版,bootfs基本是一致的,rootfs會有差別,因此不同的發行版可以公用bootfs,
鏡像分成理解
Docker鏡像采用分層結構的好處:
- 資源共享,比如有多個鏡像都從相同的Base鏡像構建而來,那么宿主機只需在磁盤上保留一份base鏡像,同時記憶體中也只需要加載一份base鏡像,這樣就可以為所有的容器服務,而且鏡像的每一層都可以被共享
使用docker image inspect 鏡像名 查看鏡像分層
docker image inspect tomcat
"RootFS": {
"Type": "layers",
"Layers": [
"sha256:e2c6ff46235709f5178ab7c1939f4fba7237ffde84e13b1582fa5f0837c1d978",
"sha256:26270c5e25fa4569f37428604f708f8863a171ec2499a066241a641017971308",
"sha256:a42439ce96509df457152574716e3c07a8d5640fe9c16f5d4fb8854f72ce357a",
"sha256:5d5962699bd5f016d81fc6d623cb0bc1f3853efdc48b6958053122caffc425de",
"sha256:26863b4714ee050f833364c81528e499eeff4f778cde2064e2db4cb24b289f08",
"sha256:e8ef11c449dc031843c8689705b8348da5931ae611b46bfaceaa974b7832fe43",
"sha256:825d742348a7bd1509510b17a2ffcdedfbd601f2f06e27441c048edd24d76e40",
"sha256:7d8560b35c34638f13784a532581d1741f21a4f8f313f6715f127f7a22612983",
"sha256:447f25b09d03785e0c1a5bd581d2f2880fe315e2e5f3e78f02f7d2fb224a1ad4",
"sha256:bc7727a11f1ace90fd41701385cdd08659866de174873a3e3b550dcab1d717db"
]
},
這個Layers就是分層
-
所有的Docker鏡像都起始于一個基礎鏡像層,當進行修改或增加新的內容時,就會在當前鏡像層之上,創建新的鏡像層,
-
舉一個簡單的例子,假如基于Ubuntu Linux 16.04創建一個新的鏡像,這就是新鏡像的第一層;如果在該鏡像中添加Python包,就會在基礎鏡像層之上創建第二個鏡像層;如果繼續添加一個安全補丁,就會創建第三個鏡像層,
-
該鏡像當前已經包含3個鏡像層

-
在添加額外的鏡像層的同時,鏡像始終保持是當前所有鏡像的組合,理解這一點非常重要,每個鏡像層包含3個檔案,而鏡像包含了來自兩個鏡像層的6個檔案,

-
上圖中的鏡像層跟之前圖中的略有區別,主要目的是便于展示檔案,
-
下圖中展示了一個稍微復雜的三層鏡像,在外部看來整個鏡像只有6個檔案,這是因為最上層中的檔案7是檔案5的一個更新版本,

-
這種情況下,上層鏡像層中的檔案覆寫了底層鏡像層中的檔案,這樣就使得檔案的更新版本作為一個新鏡像層添加到鏡像當中,
-
Docker通過存盤引擎(新版本采用快斬訓制)的方式來實作鏡像層堆疊,并保證多鏡像層對外展示為統一的檔案系統.
-
Linux上可用的存盤引擎有AUFS、Overlay2、Device Mapper、Btrfs以及ZFS,顧名思義,每種存盤引擎都基于Linux 中對應的檔案系統或者塊設備技術,并且每種存盤引擎都有其獨有的性能特點,
-
下圖展示了與系統顯示相同的三層鏡像,所有鏡像層堆疊并合并,對外提供統一的視圖,

-
Docker鏡像都是只讀的,當容器啟動時,一個新的可寫層被加載到鏡像的頂部
-
這一層就是通常說的容器層,容器之下的都叫鏡像層
Commit鏡像
提交一個自己制作的鏡像
docker commit 提交容器成為一個新的副本
docker commit [OPTIONS] CONTAINER [REPOSITORY[:TAG]]
先創建一個tomcat容器
docker run -it -p 9000:8080 --name tomcat01 tomcat /bin/bash
進入容器修改
cp -r webapps.dist/* webapps/
將修改后的容器提交成一個新的鏡像
docker commit -a="maomao" -m="add webapps" dd3e1a74ea4f tomcat02:1.0
docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
tomcat02 1.0 17282ff7d785 5 seconds ago 672MB
測驗
[root@docker run]# docker run -it -p 9000:8080 --name ceshi 172 /bin/bash
root@ec8413e7f4f7:/usr/local/tomcat# ls
BUILDING.txt LICENSE README.md RUNNING.txt conf logs temp webapps.dist
CONTRIBUTING.md NOTICE RELEASE-NOTES bin lib native-jni-lib webapps work
root@ec8413e7f4f7:/usr/local/tomcat# cd bin/
root@ec8413e7f4f7:/usr/local/tomcat/bin# ./startup.sh
Using CATALINA_BASE: /usr/local/tomcat
Using CATALINA_HOME: /usr/local/tomcat
Using CATALINA_TMPDIR: /usr/local/tomcat/temp
Using JRE_HOME: /usr/local/openjdk-11
Using CLASSPATH: /usr/local/tomcat/bin/bootstrap.jar:/usr/local/tomcat/bin/tomcat-juli.jar
Using CATALINA_OPTS:
Tomcat started.
不需要像之前一樣修改webapps目錄 就能夠訪問網頁了

鏡像的總結

- 基于運行中的容器,手動制作鏡像
- 將運行中的容器暫停(docker commit 默認暫停容器),然后將當前的狀態制作成鏡像,注意需要指定repository,只要 -a添加作者資訊,-c修改其它欄位資訊,常修改CMD資訊,
- 匯出(export)當前容器的檔案系統資訊,匯出后的格式為.tar,.tar檔案是一個中間狀態的檔案,需要使用import匯入并且設定CMD等相關資訊才是一個完整的鏡像,
- 自動化制作鏡像 Dockerfile
Dockerfile 能解決兩個問題:- 制作程序自動化:原理也是先運行容器,然后再基于運行的容器制作鏡像,但是將制作程序使用dockerfile預先指定好
- 可以引入變數:在制作鏡像時手動傳參,根據傳遞的引數制作不同的鏡像;在創建容器時手動傳參,根據傳遞的引數修改行程的配置
- 鏡像匯出和匯入
- 這并不是制作鏡像,而是共享或傳輸鏡像到其它服務器的一種方式,如果局域網中存在registory,這種方式意義不大,
- 如果局域網中沒有registory,通過公網下載鏡像會變得非常慢,因此將需要的鏡像在一臺機器上打包好,分發到各臺服務器上會更加節約時間,
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/279564.html
標籤:其他
