基本概念
鏡像(Image)
- 操作系統(tǒng)分為內(nèi)核和用戶空間膨处。
- 對(duì)Linux系統(tǒng)而言內(nèi)核啟動(dòng)后,會(huì)掛載root文件系統(tǒng)為其提供用戶空間支持。
- Image相當(dāng)于一個(gè)root文件系統(tǒng)。
- Docker鏡像是一個(gè)特殊的文件系統(tǒng)躯泰,除提供容器運(yùn)行時(shí)所需程序、庫(kù)华糖、資源麦向、配置等文件外,還包括了一些為運(yùn)行時(shí)準(zhǔn)備的一些配置參數(shù)比如匿名卷客叉、環(huán)境變量诵竭、用戶等。
- 不包括任何動(dòng)態(tài)數(shù)據(jù)十办,其內(nèi)容在構(gòu)建之后也不會(huì)被改變秀撇。
分層存儲(chǔ)
- 因?yàn)殓R像包含操作系統(tǒng)完整的root文件系統(tǒng),其體積往往是龐大的向族,因此在docker設(shè)計(jì)之初呵燕,充分利用Union FS技術(shù),將其設(shè)計(jì)為分層存儲(chǔ)的架構(gòu)件相,嚴(yán)格意義上來(lái)說(shuō)再扭,鏡像并非是一個(gè)像ISO那樣的打包文件,鏡像只是一個(gè)虛擬的概念夜矗,其實(shí)際體現(xiàn)并非由一個(gè)文件組成泛范,而是由一組文件系統(tǒng)組成,或者說(shuō)由多層文件系統(tǒng)聯(lián)合組成紊撕。
- 鏡像構(gòu)建時(shí)罢荡,會(huì)一層層構(gòu)建,前一層是后一層的基礎(chǔ)对扶。每一層構(gòu)建完就不會(huì)再發(fā)生改變区赵,后一層上的任何改變只發(fā)生在自己這一層。比如刪除前一層文件的操作浪南,實(shí)際不是真的刪除前一層的文件笼才,而是僅在當(dāng)前層標(biāo)記為該文件已刪除。在最終容器運(yùn)行的時(shí)候络凿,雖然不會(huì)看到這個(gè)文件骡送,但是實(shí)際上該文件會(huì)一直跟隨鏡像昂羡。因此,在構(gòu)建鏡像的時(shí)候摔踱,需要額外小心虐先,每一層盡量只包含改層需要添加的東西,任何額外的東西應(yīng)該在該層構(gòu)建結(jié)束前清理掉昌渤。
- 分層存儲(chǔ)的特性使得鏡像的復(fù)用赴穗,定制變的更為容易。甚至可以用之前構(gòu)建好的鏡像作為基礎(chǔ)層膀息,然后進(jìn)一步添加新的層,以定制自己所需內(nèi)容了赵,構(gòu)建新的鏡像潜支。
容器(Container)
- 鏡像和容器的關(guān)系好比是面向?qū)ο蟪绦蛟O(shè)計(jì)中的類和實(shí)例一樣俯萌,鏡像是靜態(tài)的定義崖咨,容器是鏡像運(yùn)行時(shí)的實(shí)體。容器可以被創(chuàng)建术健、啟動(dòng)络断、停止裁替、刪除、暫停等貌笨。
- 容器的實(shí)質(zhì)是進(jìn)程弱判,但與直接在宿主執(zhí)行的進(jìn)程不同,容器進(jìn)程運(yùn)行于屬于自己的獨(dú)立的命名空間锥惋。因此容器可以擁有自己的root文件系統(tǒng)昌腰、自己的網(wǎng)絡(luò)配置、自己的進(jìn)程空間膀跌,甚至自己的用戶id空間遭商。
- 容器內(nèi)的進(jìn)程是運(yùn)行在一個(gè)隔離的環(huán)境里,使用起來(lái)捅伤,就好像是一個(gè)獨(dú)立于宿主的系統(tǒng)下操作一樣劫流。這種特性使得容器封裝的應(yīng)用比直接在宿主運(yùn)行更加安全。
- 鏡像使用的是分層存儲(chǔ)丛忆,容器亦是如此祠汇。每一個(gè)容器運(yùn)行時(shí),是以鏡像為基礎(chǔ)層蘸际,在其上創(chuàng)建一個(gè)當(dāng)前容器的存儲(chǔ)層座哩,可以稱這個(gè)為容器運(yùn)行時(shí)讀寫(xiě)而準(zhǔn)備的存儲(chǔ)層為容器存儲(chǔ)層。
- 容器存儲(chǔ)層的生存周期和容器一樣粮彤,容器消亡時(shí)根穷,容器存儲(chǔ)層也隨之消亡姜骡,因此任何保存與容器的信息都會(huì)隨容器刪除而丟失。
- 按照docker最佳實(shí)踐的要求屿良,容器不應(yīng)該想其存儲(chǔ)層內(nèi)寫(xiě)入任何數(shù)據(jù)圈澈,容器存儲(chǔ)層要保持無(wú)狀態(tài)化。所有的文件寫(xiě)入操作尘惧,都應(yīng)該使用數(shù)據(jù)卷(Volume)康栈、綁定宿主目錄,在這些位置的讀寫(xiě)會(huì)跳過(guò)容器存儲(chǔ)層喷橙,直接對(duì)宿主(或網(wǎng)絡(luò)存儲(chǔ))發(fā)生讀寫(xiě)啥么,其性能和穩(wěn)定性更高。
- 數(shù)據(jù)卷的生存周期獨(dú)立于容器贰逾,容器消亡悬荣,數(shù)據(jù)卷不會(huì)消亡。因此疙剑,使用數(shù)據(jù)卷后氯迂,容器刪除或者重新運(yùn)行指揮,數(shù)據(jù)不會(huì)丟失言缤。
倉(cāng)庫(kù)(Reposition)
- 鏡像構(gòu)建完成后嚼蚀,可以在當(dāng)前宿主機(jī)上運(yùn)行。如果需要在其他服務(wù)器上使用這個(gè)鏡像管挟,需要一個(gè)集中的存儲(chǔ)轿曙、分發(fā)鏡像的服務(wù),Docker Registry倉(cāng)庫(kù)就是這樣的服務(wù)哮独。
- 一個(gè)Docker Registry中可以包含多個(gè)倉(cāng)庫(kù)(Repository)拳芙。
- 每個(gè)倉(cāng)庫(kù)可以包含多個(gè)標(biāo)題(Tag)。
- 每個(gè)標(biāo)簽可以對(duì)應(yīng)一個(gè)鏡像皮璧。
- 通常一個(gè)倉(cāng)庫(kù)會(huì)包含同一軟件不同版本的鏡像舟扎,而標(biāo)簽就常用于對(duì)應(yīng)該軟件的各個(gè)版本。
- 通過(guò)<倉(cāng)庫(kù)名>:<標(biāo)簽>的格式來(lái)指定具體是這個(gè)軟件哪個(gè)版本的鏡像悴务。如果不給出標(biāo)簽睹限,將以ltest作為默認(rèn)標(biāo)簽。
- 倉(cāng)庫(kù)名嘗嘗以兩段式路徑的形式出現(xiàn)讯檐,比如jwilder/nginx-proxy羡疗,前者往往意味著Docker Registry多用戶環(huán)境下的用戶名,后者則往往是對(duì)應(yīng)的軟件名别洪。但這并非絕對(duì)叨恨,取決于所使用的具體Docker Registry的軟件或服務(wù)。