簡(jiǎn)介
docker鏡像是一個(gè)只讀的Docker容器模板吏垮,含有Dokcer容器啟動(dòng)所需的內(nèi)容橄维。Docker鏡像是Dokcer容器的的靜態(tài)視角,Dokcer容器是Docker鏡像的運(yùn)行狀態(tài)
Dokcer鏡像結(jié)構(gòu)
rootfs
Docker鏡像的文件內(nèi)容以及一些運(yùn)行Docker容器所需要的配置文件組成了Dokcer容器運(yùn)行的靜態(tài)文件系統(tǒng)rootfs窑业。
rootfs是Docker容器啟動(dòng)時(shí)內(nèi)部進(jìn)程可見的文件系統(tǒng)翔怎,即Docker的根目錄梭灿。通常包括類Unix系統(tǒng)的文件目錄画侣,如:/dev /usr /bin /etc /tmp /lib以及Docker運(yùn)行所需要的配置、工具等堡妒。
Docker Daemon為容器過載rootfs是配乱,會(huì)先將rootfs設(shè)為只讀模式。掛載完畢之后利用聯(lián)合掛載技術(shù)在已有的只讀rootfs上再掛載一個(gè)讀寫層皮迟,可讀寫層就處于文件系統(tǒng)的最頂層搬泥,只有在Docker容器運(yùn)行過程中文件系統(tǒng)變化是,才會(huì)把變化寫到可讀寫層伏尼。
Docker鏡像主要特點(diǎn)
分層
Docker鏡像才有分層的方式構(gòu)建忿檩,每個(gè)鏡像都由一系列鏡像層構(gòu)成”祝可讀寫層始終處于文件系統(tǒng)最上層燥透,當(dāng)需要修改鏡像內(nèi)某個(gè)文件是沙咏,只對(duì)處于最上方的可讀寫層進(jìn)行修改,不覆寫下層文件內(nèi)容班套,已有文件在讀寫層中原始文件依然存在肢藐,但會(huì)唄新的鎖屏蔽。
使用docker commit提交修改保存為新的鏡像時(shí)吱韭,保存的是最上層的讀寫層被更新的文件吆豹,原始文件未保存。
寫時(shí)復(fù)制(copy-on-write)
Docker鏡像使用了寫時(shí)復(fù)制的策略理盆,多個(gè)容易共享同一個(gè)鏡像時(shí)痘煤,啟動(dòng)的時(shí)候并不需要單獨(dú)復(fù)制一份鏡像,而是將所有鏡像層以只讀方式掛載到一個(gè)掛載點(diǎn)猿规,再在上面覆蓋一個(gè)可讀寫層衷快。
未更改文件內(nèi)容時(shí),所有容器共享同一份鏡像數(shù)據(jù)姨俩。
在發(fā)生更改時(shí)烦磁,才把內(nèi)容寫到可讀寫層,隱藏老版本的文件內(nèi)容哼勇。
聯(lián)合掛載
聯(lián)合掛載就是在一個(gè)掛載點(diǎn)同時(shí)掛載多個(gè)文件系統(tǒng),將掛載點(diǎn)的原目錄與被掛載內(nèi)容進(jìn)行整合呕乎,积担,使得最終可見的文件系統(tǒng)將會(huì)包含整合之后各層的文件和目錄。實(shí)現(xiàn)這種掛載技術(shù)的文件系統(tǒng)被稱為聯(lián)合掛載系統(tǒng)猬仁。
內(nèi)容尋址
顧名思義帝璧,內(nèi)容尋址是根據(jù)文件內(nèi)容來索引鏡像和鏡像層。對(duì)鏡像層的內(nèi)容進(jìn)行校驗(yàn)和湿刽,生成一個(gè)內(nèi)容Hash值的烁,并以此Hash值作為鏡像層唯一標(biāo)識(shí)。
該機(jī)制提高了鏡像的安全性诈闺,并在pull 渴庆、push、load雅镊、save之后檢測(cè)鏡像完整性襟雷。
同時(shí),基于鏡像層的Hash校驗(yàn)和仁烹,在一定程度上減少了ID的沖突耸弄,增強(qiáng)了鏡像的共享。
Docker鏡像的幾個(gè)關(guān)鍵概念
registry
registry用于保存Docker鏡像卓缰,包括鏡像層次結(jié)構(gòu)與鏡像元數(shù)據(jù)
respository
repository是由具有某個(gè)功能的Docker鏡像的所有迭代版本構(gòu)成的鏡像組计呈。registry由一系列經(jīng)過命名的repository組成砰诵。
用戶倉庫命名有用戶名和倉庫名自稱,userName/repositoryName
manifest
manifest(描述文件)主要存在于registry中作為Docker鏡像的元數(shù)據(jù)文件捌显,在pull茁彭、push、save苇瓣、load中作為鏡像接口和基礎(chǔ)信息的描述文件尉间。
在鏡像唄pull或者load到本地宿主機(jī)時(shí),manifest被轉(zhuǎn)化為本地鏡像配置文件config
image和layer
image是用來存儲(chǔ)一組鏡像相關(guān)的元數(shù)據(jù)信息击罪,主要包括鏡像的架構(gòu)(amd64)哲嘲、鏡像的默認(rèn)配置信息、構(gòu)建鏡像的容器配置信息媳禁、包含所有鏡像層信息的rootfs眠副。Docker根據(jù)rootfs中的diff_id計(jì)算出內(nèi)容尋址的索引(chainId)萊獲取layer信息,從而進(jìn)一步獲取鏡像信息竣稽。
layer(鏡像層)是用來管理鏡像層的中間概念囱怕,主要存放了鏡像層的diff_id、size毫别、cache-id和parent等娃弓,實(shí)際的文件內(nèi)容有存儲(chǔ)驅(qū)動(dòng)萊管理,可通過cache-id在本地索引到