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