金湖網(wǎng)站設(shè)計(jì)中國(guó)搜索引擎份額排行
1. 什么是鏡像?
鏡像
是一種輕量級(jí)、可執(zhí)行的獨(dú)立軟件包,它包含運(yùn)行某個(gè)軟件所需的所有內(nèi)容,我們把應(yīng)用程序和配置依賴打包好形成一個(gè)可交付的運(yùn)行環(huán)境(包括代碼、運(yùn)行時(shí)需要的庫(kù)、環(huán)境變量和配置文件等),這個(gè)打包好的運(yùn)行環(huán)境就是image鏡像文件。
只有通過這個(gè)鏡像文件才能生成Docker容器實(shí)例(類似Java中new出來一個(gè)對(duì)象)。
1.1 分層的鏡像
以我們的pull為例,在下載的過程中我們可以看到docker的鏡像好像是在一層一層的在下載
1.2 UniFos
UnionFS(聯(lián)合文件系統(tǒng)):Union文件系統(tǒng)(UnionFS)是一種分層、輕量級(jí)并且高性能的文件系統(tǒng),它支持對(duì)文件系統(tǒng)的修改作為一次提交來一層層的疊加,同時(shí)可以將不同目錄掛載到同一個(gè)虛擬文件系統(tǒng)下(unite several directories into a single virtual filesystem)。Union 文件系統(tǒng)是 Docker 鏡像的基礎(chǔ)。鏡像可以通過分層來進(jìn)行繼承,基于基礎(chǔ)鏡像(沒有父鏡像),可以制作各種具體的應(yīng)用鏡像。
?
特性:一次同時(shí)加載多個(gè)文件系統(tǒng),但從外面看起來,只能看到一個(gè)文件系統(tǒng),聯(lián)合加載會(huì)把各層文件系統(tǒng)疊加起來,這樣最終的文件系統(tǒng)會(huì)包含所有底層的文件和目錄
1.3 Docker鏡像加載原理
Docker鏡像加載原理:
???docker的鏡像實(shí)際上由一層一層的文件系統(tǒng)組成,這種層級(jí)的文件系統(tǒng)UnionFS。
bootfs(boot file system)主要包含bootloader和kernel, bootloader主要是引導(dǎo)加載kernel, Linux剛啟動(dòng)時(shí)會(huì)加載bootfs文件系統(tǒng),在Docker鏡像的最底層是引導(dǎo)文件系統(tǒng)bootfs。這一層與我們典型的Linux/Unix系統(tǒng)是一樣的,包含boot加載器和內(nèi)核。當(dāng)boot加載完成之后整個(gè)內(nèi)核就都在內(nèi)存中了,此時(shí)內(nèi)存的使用權(quán)已由bootfs轉(zhuǎn)交給內(nèi)核,此時(shí)系統(tǒng)也會(huì)卸載bootfs。
?
rootfs (root file system) ,在bootfs之上。包含的就是典型 Linux 系統(tǒng)中的 /dev, /proc, /bin, /etc 等標(biāo)準(zhǔn)目錄和文件。rootfs就是各種不同的操作系統(tǒng)發(fā)行版,比如Ubuntu,Centos等等。?
?平時(shí)我們安裝進(jìn)虛擬機(jī)的CentOS都是好幾個(gè)G,為什么docker這里才200M??
對(duì)于一個(gè)精簡(jiǎn)的OS,rootfs可以很小,只需要包括最基本的命令、工具和程序庫(kù)就可以了,因?yàn)榈讓又苯佑肏ost的kernel,自己只需要提供 rootfs 就行了。由此可見對(duì)于不同的linux發(fā)行版, bootfs基本是一致的, rootfs會(huì)有差別, 因此不同的發(fā)行版可以公用bootfs。
bootfs作用在于,虛擬化linux內(nèi)核,rootfs構(gòu)建每個(gè)系統(tǒng)的目錄結(jié)構(gòu)。
1.4 為什么Docker鏡像要采用這種分層結(jié)構(gòu)
鏡像分層最大的一個(gè)好處就是共享資源,方便復(fù)制遷移,就是為了復(fù)用。
?
比如說有多個(gè)鏡像都從相同的 base 鏡像構(gòu)建而來,那么 Docker Host 只需在磁盤上保存一份 base 鏡像;
同時(shí)內(nèi)存中也只需加載一份 base 鏡像,就可以為所有容器服務(wù)了。而且鏡像的每一層都可以被共享。
2. 重點(diǎn)理解
?當(dāng)容器啟動(dòng)時(shí),一個(gè)新的可寫層被加載到鏡像的頂部。這一層通常被稱作“容器層”,“容器層”之下的都叫“鏡像層”。
所有對(duì)容器的改動(dòng) - 無論添加、刪除、還是修改文件都只會(huì)發(fā)生在容器層中。只有容器層是可寫的,容器層下面的所有鏡像層都是只讀的。
3. Docker鏡像commit操作案例
docker commit 提交容器副本使之成為一個(gè)新的鏡像
docker commit -m="提交描述信息" -a="作者" 容器id要?jiǎng)?chuàng)建
?
提交最新的鏡像
?啟動(dòng)我們自己最新的鏡像和原來的做對(duì)比
?
1。官網(wǎng)是默認(rèn)下載的Ubuntu沒有vim命令
2。我們自己commit構(gòu)建的鏡像,新增加了vim功能,可以成功使用。
4. 總結(jié)
Docker中的鏡像分層,支持通過擴(kuò)展現(xiàn)有鏡像,創(chuàng)建新的鏡像。類似Java繼承于一個(gè)Base基礎(chǔ)類,自己再按需擴(kuò)展。
新鏡像是從 base 鏡像一層一層疊加生成的。每安裝一個(gè)軟件,就在現(xiàn)有鏡像的基礎(chǔ)上增加一層
?