什么是Docker?Docker是一個(gè)開源項(xiàng)目,誕生于2013年初,最初是dotCloud公司(后改名為Docker Inc)內(nèi)部的一個(gè)開源的PaaS服務(wù)的業(yè)余項(xiàng)目。其基于谷歌公司推出的Go語言進(jìn)行開發(fā)實(shí)現(xiàn),后加入Linux基金會(huì),遵從Apache 2.0協(xié)議,項(xiàng)目代碼在GitHub上進(jìn)行維護(hù)。
Docker是基于Linux內(nèi)核的cgroup、namespace以及AUFS類的UnionFS等技術(shù),對進(jìn)程進(jìn)行封裝隔離,屬于操作系統(tǒng)層面的虛擬化技術(shù)。由于隔離的進(jìn)程獨(dú)立于宿主和其他的隔離的進(jìn)程,因此也稱其為容器。
Docker最初的實(shí)現(xiàn)是基于LXC(Linux Containers)。LXC是Linux原生支持的容器技術(shù),可以提供輕量級的虛擬化??梢哉fDocker就是基于LXC發(fā)展起來的,提供LXC的高級封裝和標(biāo)準(zhǔn)的配置方法。在LXC的基礎(chǔ)之上,Docker進(jìn)行了進(jìn)一步的封裝,從文件系統(tǒng)、網(wǎng)絡(luò)互聯(lián)到進(jìn)程隔離等待,極大地簡化了容器的創(chuàng)建和維護(hù),使得Docker技術(shù)比虛擬機(jī)技術(shù)更為輕便、快捷。從Docker 0.7以后開始去除了LXC,轉(zhuǎn)而使用自行開發(fā)的libcontainer;從Docker 1.11開始,則進(jìn)一步演進(jìn)為使用runC和containerd。
Docker的主要目標(biāo)是“Build、Ship and Run Any App、Anywhere”,即通過對應(yīng)用組件的封裝(Packaging)、分發(fā)(Distribution)、部署(Deployment)、運(yùn)行(Runtime)等生命周期的管理,達(dá)到應(yīng)用組件級別的“一次封裝,到處運(yùn)行”(Build once,Run anywhere)。這里的應(yīng)用組件,既可以是一個(gè)Web應(yīng)用,也可以是一套數(shù)據(jù)庫服務(wù),甚至是一個(gè)操作系統(tǒng)。
將應(yīng)用運(yùn)行在Docker容器上,可以實(shí)現(xiàn)跨平臺、跨服務(wù)器,只需一次配置準(zhǔn)備好相關(guān)的應(yīng)用環(huán)境,即可實(shí)現(xiàn)到處運(yùn)行,保證研發(fā)和生產(chǎn)環(huán)境的一致性,解決了應(yīng)用和運(yùn)行環(huán)境的兼容性問題,從而極大地提升了部署效率,減少故障的可能性。
Docker與虛擬機(jī)有著類似的資源隔離和分配的特點(diǎn),但不同的架構(gòu)方法使Docker能夠更加便攜、高效(見圖1)。
圖1 VM與Docker架構(gòu)比較
傳統(tǒng)的虛擬機(jī)架構(gòu)是:物理機(jī)→宿主機(jī)操作系統(tǒng)→Hypervisor支持→虛擬機(jī)操作系統(tǒng)→應(yīng)用程序。虛擬機(jī)是在宿主機(jī)上基于Hypervisor虛擬出一套操作系統(tǒng)所需的硬件設(shè)備,并在這些虛擬硬件上安裝操作系統(tǒng)Guest OS,運(yùn)行不同的應(yīng)用程序,應(yīng)用之間實(shí)現(xiàn)相互獨(dú)立、資源隔離。但由于需要Hypervisor來創(chuàng)建虛擬機(jī),且每個(gè)虛擬機(jī)里需要完整地運(yùn)行一套操作系統(tǒng)Guest OS,因此會(huì)帶來很多額外資源的開銷。
Docker的架構(gòu)是:物理機(jī)→宿主機(jī)操作系統(tǒng)→Docker引擎→應(yīng)用程序。Docker容器中沒有Hypervisor這一層,雖然它需要在宿主機(jī)中運(yùn)行Docker Engine,但原理卻完全不同于Hypervisor,并沒有虛擬出硬件設(shè)備,更沒有獨(dú)立部署全套的操作系統(tǒng)Guest OS。
Docker容器是使用Docker Engine而不是管理程序來執(zhí)行,因此容器比虛擬機(jī)小,并且由于主機(jī)內(nèi)核的共享,可以更快地啟動(dòng),具有更好的性能、更少的隔離和更好的兼容性。
Docker容器能夠共享一個(gè)內(nèi)核并共享應(yīng)用程序庫,因此容器比虛擬機(jī)具有更低的系統(tǒng)開銷,只要用戶愿意使用單一平臺來提供共享的操作系統(tǒng),容器可以更快、使用資源可以更少。
虛擬機(jī)可能需要幾分鐘才能創(chuàng)建并啟動(dòng),而只需幾秒鐘即可創(chuàng)建并啟動(dòng)一個(gè)容器。與在虛擬機(jī)中運(yùn)行應(yīng)用程序相比,容器中包含的應(yīng)用程序提供了卓越的性能。