docker镜像
1、鏡像是什么?
鏡像(Mirroring)是一種文件存儲形式,是冗余的一種類型,一個磁盤上的數(shù)據(jù)在另一個磁盤上存在一個完全相同的副本即為鏡像。可以把許多文件做成一個鏡像文件,與GHOST等程序放在一個盤里用GHOST等軟件打開后,又恢復成許多文件,RAID 1和RAID 10使用的就是鏡像。常見的鏡像文件格式有ISO、BIN、IMG、TAO、DAO、CIF、FCD。
2、docker鏡像加載原理
2.1、 UnionFS(聯(lián)合文件系統(tǒng))
UnionFS(聯(lián)合文件系統(tǒng)): Union文件系統(tǒng)(UnionFS)是一種分層、輕量級并且高性能的文件系統(tǒng),它支持對文件系統(tǒng)的修改作為一次提交來一層層的疊加,同時可以將不同目錄掛載到同一個虛擬文件系統(tǒng)下(unite several directories into a single virtual filesystem)。Union文件系統(tǒng)是Docker鏡像的基礎。鏡像可以通過分層來進行繼承, 基于基礎鏡像(沒有父鏡像), 可以制作各種具體的應用鏡像。
特性: 一次同時加載多個文件系統(tǒng),但從外面看起來,只能看到一個文件系統(tǒng),聯(lián)合加載會把各層文件系統(tǒng)疊加起來,這樣最終的文件系統(tǒng)會包含所有底層的文件和目錄。
2.2、 Docker鏡像加載原理
docker的鏡像實際上由一層一層的文件系統(tǒng)組成,這種層級的文件系統(tǒng)UnionFS。
bootfs(boot file system) 主要包含bootloader和kernel,bootloader主要是引導加載kernel,Linux剛啟動時會加載bootfs文件系統(tǒng),在Docker鏡像的最底層是bootfs。這一層與我們典型的Linux/Unix系統(tǒng)是一樣的, 包含boot加載器和內(nèi)核。當boot加載完成之后整個內(nèi)核就都在內(nèi)存中了,此時內(nèi)存的使用權(quán)已由bootfs轉(zhuǎn)交給內(nèi)核,此時系統(tǒng)也會卸載bootfs。
rootfs(root file system), 在bootfs之上。包含的就是典型Linux系統(tǒng)中的/dev, /proc, /bin, /etc等標準目錄和文件。rootfs就是各種不同的操作系統(tǒng)發(fā)行版,比如Ubuntu,Centos等,可以結(jié)合下圖進行理解。
現(xiàn)象:平時我們安裝進虛擬機(VM)中的CentOS或者ubantu等都是好幾個G,為什么docker安裝只有幾百MB。
本質(zhì):其實對于一個精簡的操作系統(tǒng)來說,rootfs可以很小,只需要包括最基本的命令、工具和程序庫就可以了,因為底層直接用Host的kernel,自己只需要提供 rootfs 就行了。由此可見對于不同的linux發(fā)行版, bootfs基本是一致的, rootfs會有差別, 因此不同的發(fā)行版可以公用bootfs。
3、分層理解
為了看到實際的分層效果,我們可以去下載一個鏡像,注意觀察下載的日志輸出,可以看到是一層一層的在下載,所需要的文件。
證實:
這個問題可以用 sudo docker images inspect tomcat:latest
命令來查看下載的所有層。
為什么Docker鏡像要采用這種分層的結(jié)構(gòu)?
最大的好處,我覺得莫過于是資源共享了。比如有多個鏡像都從相同的Base鏡像構(gòu)建而來,那么宿主機只需在磁盤上保留一份base鏡像,同時內(nèi)存中也只需要加載一份base鏡像,這樣就可以為所有的容器服務了,而且鏡像的每一層都可以被共享。從而來節(jié)省內(nèi)間,和資源利用率。
4、深入理解分層原理
其實所有的Docker鏡像都是于基礎鏡像層,當進行修改或增加新的內(nèi)容時,就會在基礎鏡像層之上,創(chuàng)建新的鏡像層來執(zhí)行操作,而基礎鏡像層是不會改變的。
舉一個簡單的例子,假如基于Ubuntu Linux 16.04 創(chuàng)建一個新的鏡像,這就是新鏡像的第一層;如果在該鏡像中添加Python包,就會在基礎鏡像層之上創(chuàng)建第二個鏡像層;如果繼續(xù)添加一個安全補丁,就會創(chuàng)建第三個鏡像層。
該鏡像當前已經(jīng)包含了3個鏡像,如下圖所示。
在添加 額外的鏡像層的同時,鏡像始終保持是當前所有鏡像的組合,理解這一點非常重要。下圖中舉一個簡單的例子,每個鏡像層包含3個文件,而鏡像包含了來自兩個鏡像層的6個文件
上圖中的鏡像層個數(shù)與之前圖中的略有區(qū)別,主要目的是便于展示文件。
下圖中展示了一個稍微復雜的三層鏡像,在外部看來整個鏡像只有6個文件,這是因為最上層中的文件7是文件5的一個版本更新版本
這種情況下,上層鏡像中的文件覆蓋了底層鏡像層中的文件。這樣就使得文件的更新版本作為一個新鏡像層到鏡像當中。Docker通過存儲引擎(新版本采用快照機制)的方式來實現(xiàn)鏡像層堆棧,并保證多鏡像層對外展示為同意的文件系統(tǒng)。
Linux上可用的存儲引擎有AUFS、Overlay2、Device Mapper、Btrfs以及ZFS。顧名思義,每種存儲引擎都基于Linux中對應的文件系統(tǒng)或者塊設備技術(shù),并且每種存儲引擎都有其獨有的性能特點。
Docker在Windows上僅支持Windowsfilter一種存儲引擎,該引擎基于NTFS文件系統(tǒng)之上實現(xiàn)了分層和CoW。
下圖展示了與系統(tǒng)顯示相同三層鏡像。所有鏡像層堆疊并合并,對外提供統(tǒng)一的視圖
特點:
Docker鏡像都是只讀的,當容器啟動時,一個新的可寫層被加載到鏡像的頂部!這一層就是我們通常說的容器層,容器之下都叫鏡像層,我們通常是操作容器層然后把基礎層和容器層打包成一個鏡像對外提供服務。
如下圖所示
5、提交鏡像
語法:sudo docker commit -m="提交的描述信息" -a="作者" 容器id 目標鏡像名稱
實際操作:
1.運行容器并映射端口
2.查看鏡像是否啟動
docker ps3.交互方式進入容器內(nèi)部
docker exec -it 容器id /bin/bash4.將鏡像倉庫官方的最小包鏡像進行更改,說明:由于tomcat的官方鏡像是最小包的,在webapps 目錄下沒有對應的應用,為了啟動成功看到界面,所以copy webapps.dist 下的所有文件到webapps 下,對容器層操作進行更改,然后提交更改后的容器。
cp -r webapps.dist/* webapps5.提交修改后的鏡像
sudo docker commit -m="啟動tomcat界面修改" -a="酒為知己者醉" 9813u4r9f31u9 myTomcat9.1最終將基礎鏡像和容器上的操作作為一個新的鏡像。
總結(jié)
- 上一篇: select函数分析
- 下一篇: 获取toast值