鏡像 (image)
定義:一個(gè)鏡像代表一個(gè)軟件渺杉,比如Mysql鏡像跨细、Redis鏡像臭猜、Nginx鏡像躺酒,每個(gè)鏡像都有其對(duì)應(yīng)的版本。
容器 (container)
定義:基于某個(gè)鏡像運(yùn)行一次蔑歌,就會(huì)產(chǎn)生一個(gè)程序?qū)嵗Γ@個(gè)實(shí)例就稱(chēng)之為容器,一個(gè)鏡像可以產(chǎn)生N個(gè)容器丐膝。
倉(cāng)庫(kù) (repository)
定義:用來(lái)存儲(chǔ)Docker所有鏡像量愧,包括官方鏡像和個(gè)人開(kāi)發(fā)者上傳的鏡像。
遠(yuǎn)程倉(cāng)庫(kù)
Docker在世界范圍內(nèi)維護(hù)的一個(gè)唯一的遠(yuǎn)程倉(cāng)庫(kù)帅矗。
本地倉(cāng)庫(kù)
當(dāng)前自己機(jī)器中從遠(yuǎn)程倉(cāng)庫(kù)下載的鏡像所存儲(chǔ)的位置偎肃。
鏡像、容器浑此、倉(cāng)庫(kù)關(guān)系圖
Docker鏡像原理
Docker鏡像是一種輕量級(jí)的累颂,可執(zhí)行的獨(dú)立軟件包,用來(lái)打包軟件運(yùn)行環(huán)境和基于運(yùn)行環(huán)境開(kāi)發(fā)的軟件凛俱,它包含某個(gè)軟件所需的所有內(nèi)容紊馏,包括代碼、運(yùn)行時(shí)的依賴(lài)庫(kù)蒲犬,環(huán)境變量和配置文件朱监。
Docker鏡像問(wèn)什么這么大?
Docker采用UnionFS(聯(lián)合文件系統(tǒng))文件系統(tǒng),UnionFS是一種分層原叮,輕量級(jí)并且高性能的文件系統(tǒng)赫编,支持對(duì)文件系統(tǒng)的修改作為一次提交來(lái)一層層疊加,同時(shí)可以將不同目錄掛載到同一個(gè)虛擬文件系統(tǒng)下奋隶,UnionFS文件系統(tǒng)是Docker鏡像的基礎(chǔ)擂送,這種文件系統(tǒng)的特性是:一次同時(shí)加載多個(gè)文件系統(tǒng),但從外面看起來(lái)唯欣,只能看到一個(gè)文件系統(tǒng)嘹吨,聯(lián)合加載會(huì)把各層文件系統(tǒng)疊加起來(lái),這樣最終的文件系統(tǒng)就會(huì)包含所有底層的文件和目錄境氢。所以Docker鏡像才會(huì)很大蟀拷。
Docker鏡像構(gòu)成
Docker鏡像的最底層是bootfs(boot file system) ,bootfs包含bootloader和kernel产还,Linux剛啟動(dòng)時(shí)會(huì)加載bootfs文件系統(tǒng)匹厘,這時(shí)由bootloader引導(dǎo)加載kernel,將整個(gè)內(nèi)核加載到內(nèi)存中脐区。
在bootfs之上是rootfs(root file system)愈诚,rootfs就是各種不同的操作系統(tǒng)發(fā)行版,比如Ubuntu/Centos等牛隅,rootfs主要包含/dev炕柔,/bin,/etc等標(biāo)準(zhǔn)目錄和文件媒佣,由于Linux不同發(fā)行版本的bootfs是一致的匕累,但是rootfs會(huì)有所差別,因此不同的發(fā)行版本可以共用bootfs默伍。
在rootfs之上欢嘿,是各種軟件的依賴(lài)庫(kù)衰琐,以mysql為例,mysql5.7和mysql8.0所依賴(lài)的庫(kù)肯定有所不同炼蹦,所以不同版本的軟件有相應(yīng)的依賴(lài)庫(kù)羡宙,最上層的就是各種版本具體的軟件,如下圖所示:
Docker鏡像為什么采用分層結(jié)構(gòu)
Docker采用分層結(jié)構(gòu)最大的好處就是資源共享掐隐,減少整個(gè)倉(cāng)庫(kù)的整體體積狗热。比如所有的鏡像都是基于bootfs構(gòu)建,那么宿主機(jī)只需在磁盤(pán)中保存一份bootfs鏡像虑省,同時(shí)內(nèi)存中也只需要加載一份bootfs鏡像匿刮,就可以為所有容器服務(wù)。而且鏡像的每一層都可以被共享探颈。
Docker鏡像是只讀的熟丸,當(dāng)鏡像運(yùn)行時(shí),一個(gè)新的可寫(xiě)層被加載到鏡像的頂部伪节,這一層通常被稱(chēng)為容器層虑啤,容器層之下都叫鏡像層。