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