官網(wǎng):https://www.docker.com/
docker倉庫:https://hub.docker.com/
公司名稱:原名dotCloud 14年改名為docker
容器產(chǎn)品:docker (16年已經(jīng)被更名為Moby)
一、docker容器歷史
和虛擬機一樣,容器技術(shù)也是一種資源隔離的虛擬化技術(shù)寡键。我們追溯它的歷史闻葵,會發(fā)現(xiàn)它的技術(shù)雛形早已有之脚囊。
1. 容器簡史
容器概念始于 1979 年提出的 UNIX chroot爷辙,它是一個 UNIX 操作系統(tǒng)的系統(tǒng)調(diào)用,將一個進程及其子進程的根目錄改變到文件系統(tǒng)中的一個新位置皮胡,讓這些進程只能訪問到這個新的位置褐墅,從而達到了進程隔離的目的拆檬。
2000 年的時候 FreeBSD 開發(fā)了一個類似于 chroot 的容器技術(shù) Jails,這是最早期妥凳,也是功能最多的容器技術(shù)竟贯。Jails 英譯過來是監(jiān)獄的意思,這個“監(jiān)獄”(用沙盒更為準確)包含了文件系統(tǒng)逝钥、用戶屑那、網(wǎng)絡(luò)、進程等的隔離。
2001 Linux 也發(fā)布自己的容器技術(shù) Linux VServer持际,2004 Solaris 也發(fā)布了 Solaris Containers沃琅,兩者都將資源進行劃分,形成一個個 zones蜘欲,又叫做虛擬服務(wù)器益眉。
2005 年推出 OpenVZ,它通過對 Linux 內(nèi)核進行補丁來提供虛擬化的支持姥份,每個 OpenVZ 容器完整支持了文件系統(tǒng)呜叫、用戶及用戶組、進程殿衰、網(wǎng)絡(luò)、設(shè)備和 IPC 對象的隔離盛泡。
2007 年 Google 實現(xiàn)了 Control Groups( cgroups )
闷祥,并加入到 Linux 內(nèi)核中,這是劃時代
的傲诵,為后期容器的資源配額提供了技術(shù)保障凯砍。
2008 年基于 cgroups 和 linux namespace 推出了第一個最為完善的 Linux 容器 LXC。
2013 年推出到現(xiàn)在為止最為流行和使用最廣泛的容器 Docker
拴竹,相比其他早期的容器技術(shù)悟衩,Docker 引入了一整套容器管理的生態(tài)系統(tǒng),包括分層的鏡像模型栓拜,容器注冊庫座泳,友好的 Rest API。
2014 年 CoreOS 也推出了一個類似于 Docker 的容器 Rocket幕与,CoreOS 一個更加輕量級的 Linux 操作系統(tǒng)挑势,在安全性上比 Docker 更嚴格。
2016 年微軟也在 Windows 上提供了容器的支持啦鸣,Docker 可以以原生方式運行在 Windows 上潮饱,而不是需要使用 Linux 虛擬機。
基本上到這個時間節(jié)點诫给,容器技術(shù)就已經(jīng)很成熟了香拉,再往后就是容器云的發(fā)展,由此也衍生出多種容器云的平臺管理技術(shù)中狂,其中以 kubernetes 最為出眾凫碌,有了這樣一些細粒度的容器集群管理技術(shù),也為微服務(wù)的發(fā)展奠定了基石吃型。因此证鸥,對于未來來說,應(yīng)用的微服務(wù)化是一個較大的趨勢。
2. 為什么需要容器
其一枉层,這是技術(shù)演進的一種創(chuàng)新結(jié)果泉褐,其二,這是人們追求高效生產(chǎn)活動的一種工具鸟蜡。
隨著軟件開發(fā)的發(fā)展膜赃,相比于早期的集中式應(yīng)用部署方式,現(xiàn)在的應(yīng)用基本都是采用分布式的部署方式揉忘,一個應(yīng)用可能包含多種服務(wù)或多個模塊跳座,因此多種服務(wù)可能部署在多種環(huán)境中,如虛擬服務(wù)器泣矛、公有云疲眷、私有云等,由于多種服務(wù)之間存在一些依賴關(guān)系您朽,所以可能存在應(yīng)用在運行過程中的動態(tài)遷移問題狂丝,那這時如何保證不同服務(wù)在不同環(huán)境中都能平滑的適配,不需要根據(jù)環(huán)境的不同而去進行相應(yīng)的定制哗总,就顯得尤為重要几颜。
就像貨物的運輸問題一樣,如何將不同的貨物放在不同的運輸機器上讯屈,減少因貨物的不同而頻繁進行貨物的裝載和卸載蛋哭,浪費大量的人力物力。
為此人們發(fā)明了集裝箱涮母,將貨物根據(jù)尺寸形狀等的不同谆趾,用不同規(guī)格的集裝箱裝載,然后再放到運輸機上運輸叛本,由于集裝箱密封棺妓,只有貨物到達目的地才需拆封,在運輸過程能夠再不同運輸機上平滑過渡炮赦,所以避免了資源的浪費怜跑。
因此集裝箱被譽為是運輸業(yè)與世界貿(mào)易最重要的發(fā)明。
Docker 容器的思想就是采用集裝箱思想吠勘,為應(yīng)用提供了一個基于容器的標準化運輸系統(tǒng)性芬。Docker 可以將任何應(yīng)用及其依賴打包成一個輕量級、可移植剧防、自包含的容器植锉。容器可以運行在幾乎所有的操作系統(tǒng)上。這樣容器就可以跑在任何環(huán)境中峭拘,因此才有了那句話:
Build Once, Run Anywhere
這種集裝箱的思想我們也能從 Docker 的 Logo 中看出來俊庇,這不就是一堆集裝箱嗎狮暑?
3. Docker對paas的降維打擊
IaaS:infrastructure as a service (基礎(chǔ)設(shè)施及服務(wù))
PaaS:platform as a service (平臺及服務(wù))
SaaS:software as a service (軟件及服務(wù))
dSaaS:data storage as a service (數(shù)據(jù)傳輸及服務(wù))
CaaS:container as a service (容器及服務(wù))
3.1 PaaS 項目成功的主要原因
是它提供了一種名叫"應(yīng)用托管"的能力。
paas之前主流用戶的普遍用法是租一批 AWS 或者 OpenStack 的虛擬機辉饱,然后像以前管理物理服務(wù)器那樣搬男,用腳本或者手工的方式在這些機器上部署應(yīng)用。
這個部署過程會碰到云端虛擬機和本地環(huán)境不一致的問題彭沼,所以當(dāng)時的云計算服務(wù)缔逛,比的就是誰能更好地模擬本地服務(wù)器環(huán)境,能帶來更好的"上云"體驗姓惑。而 PaaS 開源項目的出現(xiàn)褐奴,就是當(dāng)時解決這個問題的一個最佳方案。
3.2 PaaS 如何部署應(yīng)用
虛擬機創(chuàng)建好之后于毙,運維人員只需要在這些機器上部署一個 Cloud Foundry 項目敦冬,然后開發(fā)者只要執(zhí)行一條命令就能把本地的應(yīng)用部署到云上,這條命令就是:# cf push " 應(yīng)用 "
3.3 PaaS 項目的核心組件
像 Cloud Foundry 這樣的 PaaS 項目唯沮,最核心的組件就是一套應(yīng)用的打包和分發(fā)機制匪补。 Cloud Foundry 為每種主流編程語言都定義了一種打包格式,而"cf push"的作用烂翰,基本上等同于用戶把應(yīng)用的可執(zhí)行文件和啟動腳本打進一個壓縮包內(nèi),上傳到云上 Cloud Foundry 的存儲中蚤氏。接著甘耿,Cloud Foundry 會通過調(diào)度器選擇一個可以運行這個應(yīng)用的虛擬機,然后通知這個機器上的 Agent 把應(yīng)用壓縮包下載下來啟動竿滨。
由于需要在一個虛擬機上啟動很多個來自不同用戶的應(yīng)用佳恬,Cloud Foundry 會調(diào)用操作系統(tǒng)的 Cgroups 和 Namespace 機制為每一個應(yīng)用單獨創(chuàng)建一個稱作"沙盒"的隔離環(huán)境,然后在"沙盒"中啟動這些應(yīng)用進程于游。這就實現(xiàn)了把多個用戶的應(yīng)用互不干涉地在虛擬機里批量自動地運行起來的目的毁葱。
這正是 PaaS 項目最核心的能力。 而這些 Cloud Foundry 用來運行應(yīng)用的隔離環(huán)境贰剥,或者說"沙盒"倾剿,就是所謂的"容器"。
注:Cloud Foundry是當(dāng)時非常主流非嘲龀桑火的一個PaaS項目
3.4 Docker 鏡像
Docker 項目確實與 Cloud Foundry 的容器在大部分功能和實現(xiàn)原理上都是一樣的前痘,可偏偏就是這剩下的一小部分不一樣的功能,成了 Docker 項目接下來"呼風(fēng)喚雨"的不二法寶担忧。這個功能芹缔,就是 Docker 鏡像。
恐怕連 Docker 項目的作者 Solomon Hykes 自己當(dāng)時都沒想到瓶盛,這個小小的創(chuàng)新最欠,在短短幾年內(nèi)就如此迅速地改變了整個云計算領(lǐng)域的發(fā)展歷程示罗。
3.5 PaaS的問題:
PaaS 之所以能夠幫助用戶大規(guī)模部署應(yīng)用到集群里,是因為它提供了一套應(yīng)用打包的功能芝硬⊙恋悖可就是這個打包功能,卻成了 PaaS 日后不斷遭到用戶詬病的一個"軟肋"吵取。
根本原因禽额,一旦用上了 PaaS,用戶就必須為每種語言皮官、每種框架脯倒,甚至每個版本的應(yīng)用維護一個打好的包。這個打包過程捺氢,沒有任何章法可循藻丢,更麻煩的是,明明在本地運行得好好的應(yīng)用摄乒,卻需要做很多修改和配置工作才能在 PaaS 里運行起來悠反。而這些修改和配置,并沒有什么經(jīng)驗可以借鑒馍佑,基本上得靠不斷試錯斋否,直到你摸清楚了本地應(yīng)用和遠端 PaaS 匹配的"脾氣"才能夠搞定。
最后結(jié)局是拭荤,"cf push"確實是能一鍵部署了茵臭,但是為了實現(xiàn)這個一鍵部署,用戶為每個應(yīng)用打包的工作可謂一波三折舅世,費盡心機旦委。
而Docker 鏡像解決的,恰恰就是打包這個根本性的問題雏亚。
3.6 Docker 鏡像的精髓
所謂 Docker 鏡像缨硝,其實就是一個壓縮包。但是這個壓縮包里的內(nèi)容罢低,比 PaaS 的應(yīng)用可執(zhí)行文件 + 啟停腳本的組合就要豐富多了查辩。實際上,大多數(shù) Docker 鏡像是直接由一個完整操作系統(tǒng)的所有文件和目錄構(gòu)成的网持,所以這個壓縮包里的內(nèi)容跟你本地開發(fā)和測試環(huán)境用的操作系統(tǒng)是完全一樣的宜肉。
這就有意思了:假設(shè)你的應(yīng)用在本地運行時,能看見的環(huán)境是 CentOS 7.2 操作系統(tǒng)的所有文件和目錄翎碑,那么只要用 CentOS 7.2 的 ISO 做一個壓縮包谬返,再把你的應(yīng)用可執(zhí)行文件也壓縮進去,那么無論在哪里解壓這個壓縮包日杈,都可以得到與你本地測試時一樣的環(huán)境遣铝。當(dāng)然佑刷,你的應(yīng)用也在里面!
這就是 Docker 鏡像最厲害的地方:只要有這個壓縮包在手酿炸,你就可以使用某種技術(shù)創(chuàng)建一個"沙盒"瘫絮,在"沙盒"中解壓這個壓縮包,然后就可以運行你的程序了填硕。
更重要的是麦萤,這個壓縮包包含了完整的操作系統(tǒng)文件和目錄,也就是包含了這個應(yīng)用運行所需要的所有依賴扁眯,所以你可以先用這個壓縮包在本地進行開發(fā)和測試壮莹,完成之后,再把這個壓縮包上傳到云端運行姻檀。
在這個過程中命满,你完全不需要進行任何配置或者修改,因為這個壓縮包賦予了你一種極其寶貴的能力:本地環(huán)境和云端環(huán)境的高度一致绣版!
這胶台,正是 Docker 鏡像的精髓。
那么杂抽,有了 Docker 鏡像這個利器诈唬,PaaS 里最核心的打包系統(tǒng)一下子就沒了用武之地,最讓用戶抓狂的打包過程也隨之消失了缩麸。相比之下铸磅,在當(dāng)今的互聯(lián)網(wǎng)里,Docker 鏡像需要的操作系統(tǒng)文件和目錄匙睹,可謂唾手可得。
所以济竹,你只需要提供一個下載好的操作系統(tǒng)文件與目錄痕檬,然后使用它制作一個壓縮包即可,這個命令就是:# docker build " 鏡像 "
鏡像制作完成送浊,用戶就可以讓 Docker 創(chuàng)建一個"沙盒"來解壓這個鏡像梦谜,然后在"沙盒"中運行自己的應(yīng)用,這個命令就是:# docker run " 鏡像 "
3.7 Docker 項目給 PaaS 世界帶來的"降維打擊"
其實是提供了一種非常便利的打包機制袭景。這種機制直接打包了應(yīng)用運行所需要的整個操作系統(tǒng)唁桩,從而保證了本地環(huán)境和云端環(huán)境的高度一致,避免了用戶通過"試錯"來匹配兩種不同運行環(huán)境之間差異的痛苦過程耸棒。
二荒澡、容器和虛擬機的區(qū)別
容器提供了基于進程的隔離,而虛擬機提供了資源的完全隔離与殃。虛擬機可能需要一分鐘來啟動单山,而容器只需要一秒鐘或更短碍现。容器使用宿主操作系統(tǒng)的內(nèi)核,而虛擬機使用獨立的內(nèi)核米奸。Docker 的局限性之一是昼接,它只能用在 64 位的操作系統(tǒng)上。
1. Docker對服務(wù)器端開發(fā)/部署帶來的變化
實現(xiàn)更輕量級的虛擬化悴晰,方便快速部署
對于部署來說可以極大的減少部署的時間成本和人力成本
Docker支持將應(yīng)用打包進一個可以移植的容器中慢睡,重新定義了應(yīng)用開發(fā),測試铡溪,部署上線的過程漂辐,核心理念就是:Build once,Run anywhere
1)標準化應(yīng)用發(fā)布佃却,docker容器包含了運行環(huán)境和可執(zhí)行程序者吁,可以跨平臺和主機使用;
2)節(jié)約時間饲帅,快速部署和啟動复凳,VM啟動一般是分鐘級,docker容器啟動是秒級灶泵;
3)方便構(gòu)建基于SOA架構(gòu)或微服務(wù)架構(gòu)的系統(tǒng)育八,通過服務(wù)編排,更好的松耦合赦邻;
4)節(jié)約成本髓棋,以前一個虛擬機至少需要幾個G的磁盤空間,docker容器可以減少到MB級惶洲;
5)方便持續(xù)集成按声,通過與代碼進行關(guān)聯(lián)使持續(xù)集成非常方便;
6)可以作為集群系統(tǒng)的輕量主機或節(jié)點恬吕,在IaaS平臺上签则,已經(jīng)出現(xiàn)了CaaS,通過容器替代原來的主機铐料。
2. Docker 優(yōu)勢
2.1 交付物標準化
Docker是軟件工程領(lǐng)域的"標準化"交付組件渐裂,最恰到好處的類比是"集裝箱"。
集裝箱將零散钠惩、不易搬運的大量物品封裝成一個整體柒凉,集裝箱更重要的意義在于它提供了一種通用的封裝貨物的標準,卡車篓跛、火車膝捞、貨輪、橋吊等運輸或搬運工具采用此標準愧沟,隧道绑警、橋梁等也采用此標準求泰。以集裝箱為中心的標準化設(shè)計大大提高了物流體系的運行效率。
傳統(tǒng)的軟件交付物包括:應(yīng)用程序计盒、依賴軟件安裝包渴频、配置說明文檔、安裝文檔北启、上線文檔等非標準化組件卜朗。
Docker的標準化交付物稱為"鏡像",它包含了應(yīng)用程序及其所依賴的運行環(huán)境咕村,大大簡化了應(yīng)用交付的模式场钉。
2.2 一次構(gòu)建,多次交付
類似于集裝箱的"一次裝箱懈涛,多次運輸"逛万,Docker鏡像可以做到"一次構(gòu)建,多次交付"批钠。當(dāng)涉及到應(yīng)用程序多副本部署或者應(yīng)用程序遷移時宇植,更能體現(xiàn)Docker的價值。
2.3 應(yīng)用隔離
集裝箱可以有效做到貨物之間的隔離埋心,使化學(xué)物品和食品可以堆砌在一起運輸指郁。Docker可以隔離不同應(yīng)用程序之間的相互影響,但是比虛擬機開銷更小拷呆。
總之闲坎,容器技術(shù)部署速度快,開發(fā)茬斧、測試更敏捷腰懂;提高系統(tǒng)利用率,降低資源成本项秉。
3. Docker的度量
Docker是利用容器來實現(xiàn)的一種輕量級的虛擬技術(shù)绣溜,從而在保證隔離性的同時達到節(jié)省資源的目的。Docker的可移植性可以讓它一次建立伙狐,到處運行涮毫。Docker的度量可以從以下四個方面進行:
3.1 隔離性
Docker采用libcontainer作為默認容器瞬欧,代替了以前的LXC贷屎。libcontainer的隔離性主要是通過內(nèi)核的命名空間來實現(xiàn)的,有pid艘虎、net唉侄、ipc、mnt野建、uts命令空間属划,將容器的進程恬叹、網(wǎng)絡(luò)、消息同眯、文件系統(tǒng)和主機名進行隔離绽昼。
3.2 可度量性
Docker主要通過cgroups控制組來控制資源的度量和分配。
3.3 移植性
Docker利用AUFS來實現(xiàn)對容器的快速更新须蜗。
AUFS是一種支持將不同目錄掛載到同一個虛擬文件系統(tǒng)下的文件系統(tǒng)硅确,支持對每個目錄的讀寫權(quán)限管理。AUFS具有層的概念明肮,每一次修改都是在已有的只寫層進行增量修改菱农,修改的內(nèi)容將形成新的文件層,不影響原有的層柿估。
3.4 安全性
安全性可以分為容器內(nèi)部之間的安全性循未;容器與托管主機之間的安全性。
容器內(nèi)部之間的安全性主要是通過命名空間和cgroups來保證的秫舌。
容器與托管主機之間的安全性主要是通過內(nèi)核能力機制的控制的妖,可以防止Docker非法入侵托管主機。
4. Docker容器使用AUFS作為文件系統(tǒng)舅巷,有如下優(yōu)勢:
4.1 節(jié)省存儲空間
多個容器可以共享同一個基礎(chǔ)鏡像存儲羔味。
4.2 快速部署
如果部署多個來自同一個基礎(chǔ)鏡像的容器時,可以避免多次復(fù)制操作钠右。
4.3 升級方便
升級一個基礎(chǔ)鏡像即可影響到所有基于它的容器赋元。
4.4 增量修改
可以在不改變基礎(chǔ)鏡像的同時修改其目錄的文件,所有的更高都發(fā)生在最上層的寫操作層飒房,增加了基礎(chǔ)鏡像的可共享內(nèi)容搁凸。
三、容器應(yīng)用場景
1. 簡化配置
這是Docker公司宣傳的Docker的主要使用場景狠毯。虛擬機的最大好處是能在你的硬件設(shè)施上運行各種配置不一樣的平臺(軟件护糖、系統(tǒng)),Docker在降低額外開銷的情況下提供了同樣的功能嚼松。它能讓你將運行環(huán)境和配置放在代碼中然后部署嫡良,同一個Docker的配置可以在不同的環(huán)境中使用,這樣就降低了硬件要求和應(yīng)用環(huán)境之間耦合度献酗。
2. 代碼流水線(Code Pipeline)管理
前一個場景對于管理代碼的流水線起到了很大的幫助寝受。代碼從開發(fā)者的機器到最終在生產(chǎn)環(huán)境上的部署,需要經(jīng)過很多的中間環(huán)境罕偎。而每一個中間環(huán)境都有自己微小的差別很澄,Docker給應(yīng)用提供了一個從開發(fā)到上線均一致的環(huán)境,讓代碼的流水線變得簡單不少。
3. 提高開發(fā)效率
這就帶來了一些額外的好處:Docker能提升開發(fā)者的開發(fā)效率甩苛。如果你想看一個詳細一點的例子蹂楣,可以參考Aater在 DevOpsDays Austin 2014 大會或者是DockerCon上的演講。
不同的開發(fā)環(huán)境中讯蒲,我們都想把兩件事做好痊土。一是我們想讓開發(fā)環(huán)境盡量貼近生產(chǎn)環(huán)境,二是我們想快速搭建開發(fā)環(huán)境墨林。
理想狀態(tài)中施戴,要達到第一個目標,我們需要將每一個服務(wù)都跑在獨立的虛擬機中以便監(jiān)控生產(chǎn)環(huán)境中服務(wù)的運行狀態(tài)萌丈。然而赞哗,我們卻不想每次都需要網(wǎng)絡(luò)連接,每次重新編譯的時候遠程連接上去特別麻煩辆雾。這就是Docker做的特別好的地方肪笋,開發(fā)環(huán)境的機器通常內(nèi)存比較小,之前使用虛擬的時候度迂,我們經(jīng)常需要為開發(fā)環(huán)境的機器加內(nèi)存藤乙,而現(xiàn)在Docker可以輕易的讓幾十個服務(wù)在Docker中跑起來。
4. 隔離應(yīng)用
有很多種原因會讓你選擇在一個機器上運行不同的應(yīng)用惭墓,比如之前提到的提高開發(fā)效率的場景等坛梁。
我們經(jīng)常需要考慮兩點,一是因為要降低成本而進行服務(wù)器整合腊凶,二是將一個整體式的應(yīng)用拆分成松耦合的單個服務(wù)(注:微服務(wù)架構(gòu))划咐。
5. 整合服務(wù)器
正如通過虛擬機來整合多個應(yīng)用,Docker隔離應(yīng)用的能力使得Docker可以整合多個服務(wù)器以降低成本钧萍。由于沒有多個操作系統(tǒng)的內(nèi)存占用褐缠,以及能在多個實例之間共享沒有使用的內(nèi)存,Docker可以比虛擬機提供更好的服務(wù)器整合解決方案风瘦。
6. 調(diào)試能力
Docker提供了很多的工具队魏,這些工具不一定只是針對容器,但是卻適用于容器万搔。它們提供了很多的功能胡桨,包括可以為容器設(shè)置檢查點、設(shè)置版本和查看兩個容器之間的差別瞬雹,這些特性可以幫助調(diào)試Bug昧谊。
7. 多租戶環(huán)境
另外一個Docker有意思的使用場景是在多租戶的應(yīng)用中,它可以避免關(guān)鍵應(yīng)用的重寫挖炬。我們一個特別的關(guān)于這個場景的例子是為IoT(注:物聯(lián)網(wǎng))的應(yīng)用開發(fā)一個快速揽浙、易用的多租戶環(huán)境。這種多租戶的基本代碼非常復(fù)雜意敛,很難處理馅巷,重新規(guī)劃這樣一個應(yīng)用不但消耗時間,也浪費金錢草姻。
使用Docker钓猬,可以為每一個租戶的應(yīng)用層的多個實例創(chuàng)建隔離的環(huán)境,這不僅簡單而且成本低廉撩独,當(dāng)然這一切得益于Docker環(huán)境的啟動速度和其高效的命令敞曹。
8. 快速部署
在虛擬機之前,引入新的硬件資源需要消耗幾天的時間综膀。虛擬化技術(shù)(Virtualization)將這個時間縮短到了分鐘級別澳迫。而Docker通過為進程僅僅創(chuàng)建一個容器而無需啟動一個操作系統(tǒng),再次將這個過程縮短到了秒級剧劝。這正是Google和Facebook都看重的特性橄登。
四、Docker容器基本概念
1. Docker系統(tǒng)
1.1 Docker系統(tǒng)有兩個程序
docker服務(wù)端:
是一個服務(wù)進程讥此,管理著所有的容器拢锹。docker客戶端:
扮演著docker服務(wù)端的遠程控制器,可以用來控制docker的服務(wù)端進程萄喳。1.2 Docker三大核心組件
Docker 鏡像 - Docker images
Docker 倉庫 - Docker registeries
Docker 容器 - Docker containers1.3 Docker 倉庫
用來保存鏡像卒稳,可以理解為代碼控制中的代碼倉庫栈虚。同樣的球订,Docker 倉庫也有公有和私有的概念模捂。
公有的 Docker 倉庫名字是 Docker Hub祟霍。Docker Hub 提供了龐大的鏡像集合供使用豺裆。這些鏡像可以是自己創(chuàng)建领突,或者在別人的鏡像基礎(chǔ)上創(chuàng)建笋敞。Docker 倉庫是 Docker 的分發(fā)部分观挎。
2. Docker 鏡像
Docker 鏡像是 Docker 容器運行時的只讀模板觉痛,每一個鏡像由一系列的層 (layers) 組成役衡。Docker 使用 UnionFS 來將這些層聯(lián)合到單獨的鏡像中。UnionFS 允許獨立文件系統(tǒng)中的文件和文件夾(稱之為分支)被透明覆蓋薪棒,形成一個單獨連貫的文件系統(tǒng)手蝎。正因為有了這些層的存在,Docker 是如此的輕量俐芯。當(dāng)你改變了一個 Docker 鏡像棵介,比如升級到某個程序到新的版本,一個新的層會被創(chuàng)建吧史。因此邮辽,不用替換整個原先的鏡像或者重新建立(在使用虛擬機的時候你可能會這么做),只是一個新的層被添加或升級了。現(xiàn)在你不用重新發(fā)布整個鏡像吨述,只需要升級岩睁,層使得分發(fā) Docker 鏡像變得簡單和快速。
在 Docker 的術(shù)語里揣云,一個只讀層被稱為鏡像捕儒,一個鏡像是永久不會變的。
由于 Docker 使用一個統(tǒng)一文件系統(tǒng)邓夕,Docker 進程認為整個文件系統(tǒng)是以讀寫方式掛載的刘莹。 但是所有的變更都發(fā)生頂層的可寫層,而下層的原始的只讀鏡像文件并未變化焚刚。由于鏡像不可寫点弯,所以鏡像是無狀態(tài)的。
每一個鏡像都可能依賴于由一個或多個下層的組成的另一個鏡像矿咕。下層那個鏡像是上層鏡像的父鏡像蒲拉。
鏡像名字:
registry/repo:tag
daocloud.io/library/centos:7基礎(chǔ)鏡像:
一個沒有任何父鏡像的鏡像,叫做基礎(chǔ)鏡像痴腌。鏡像ID:
所有鏡像都是通過一個 64 位十六進制字符串 (內(nèi)部是一個 256 bit 的值)來標識的雌团。 為簡化使用,前 12 個字符可以組成一個短ID士聪,可以在命令行中使用锦援。短ID還是有一定的碰撞機率,所以服務(wù)器總是返回長ID剥悟。
3. Docker 容器
Docker 容器和文件夾很類似灵寺,一個Docker容器包含了所有的某個應(yīng)用運行所需要的環(huán)境。每一個 Docker 容器都是從 Docker 鏡像創(chuàng)建的区岗。Docker 容器可以運行略板、開始、停止慈缔、移動和刪除叮称。每一個 Docker 容器都是獨立和安全的應(yīng)用平臺,Docker 容器是 Docker 的運行部分藐鹤。