天天看點

《第一本Docker書(修訂版)》——第1章 簡介 1.1Docker簡介

本節書摘來自異步社群《第一本docker書(修訂版)》一書中的第1章,第1.1節,作者:【澳】james turnbull(詹姆斯•特恩布爾)著,更多章節内容可以通路雲栖社群“異步社群”公衆号檢視

在計算世界中,容器擁有一段漫長且傳奇的曆史。容器與管理程式虛拟化(hypervisor virtualization,hv)有所不同,管理程式虛拟化通過中間層将一台或多台獨立的機器虛拟運作于實體硬體之上,而容器則是直接運作在作業系統核心之上的使用者空間。是以,容器虛拟化也被稱為“作業系統級虛拟化”,容器技術可以讓多個獨立的使用者空間運作在同一台主控端上。

由于“客居”于作業系統,容器隻能運作與底層主控端相同或相似的作業系統,這看起來并不是非常靈活。例如,可以在ubuntu伺服器中運作redhat enterprise linux,但卻無法在ubuntu伺服器上運作microsoft windows。

相對于徹底隔離的管理程式虛拟化,容器被認為是不安全的。而反對這一觀點的人則認為,由于虛拟機所虛拟的是一個完整的作業系統,這無疑增大了攻擊範圍,而且還要考慮管理程式層潛在的暴露風險。

盡管有諸多局限性,容器還是被廣泛部署于各種各樣的應用場合。在超大規模的多租戶服務部署、輕量級沙盒以及對安全要求不太高的隔離環境中,容器技術非常流行。最常見的一個例子就是“權限隔離監牢”(chroot jail),它建立一個隔離的目錄環境來運作程序。如果權限隔離監牢中正在運作的程序被入侵者攻破,入侵者便會發現自己“身陷囹圄”,因為權限不足被困在容器建立的目錄中,無法對主控端進行進一步的破壞。

最新的容器技術引入了openvz、solaris zones以及linux容器(如lxc)。使用這些新技術,容器不再僅僅是一個單純的運作環境。在自己的權限範圍内,容器更像是一個完整的主控端。對docker來說,它得益于現代linux核心特性,如控件組(control group)、命名空間(namespace)技術,容器和主控端之間的隔離更加徹底,容器有獨立的網絡和存儲棧,還擁有自己的資源管理能力,使得同一台主控端中的多個容器可以友好地共存。

容器經常被認為是精益技術,因為容器需要的開銷有限。和傳統的虛拟化以及半虛拟化(paravirtualization)相比,容器運作不需要模拟層(emulation layer)和管理層(hypervisor layer),而是使用作業系統的系統調用接口。這降低了運作單個容器所需的開銷,也使得主控端中可以運作更多的容器。

盡管有着光輝的曆史,容器仍未得到廣泛的認可。一個很重要的原因就是容器技術的複雜性:容器本身就比較複雜,不易安裝,管理和自動化也很困難。而docker就是為改變這一切而生。

docker是一個能夠把開發的應用程式自動部署到容器的開源引擎。由docker公司(www.docker.com,前dotcloud公司,paas市場中的老牌提供商)的團隊編寫,基于apache 2.0開源授權協定發行。

那麼docker有什麼特别之處呢?docker在虛拟化的容器執行環境中增加了一個應用程式部署引擎。該引擎的目标就是提供一個輕量、快速的環境,能夠運作開發者的程式,并友善高效地将程式從開發者的筆記本部署到測試環境,然後再部署到生産環境。docker極其簡潔,它所需的全部環境隻是一台僅僅安裝了相容版本的linux核心和二進制檔案最小限的主控端。而docker的目标就是要提供以下這些東西。

1.1.1 提供一個簡單、輕量的模組化方式

docker上手非常快,使用者隻需要幾分鐘,就可以把自己的程式“docker化”(dockerize)。docker依賴于“寫時複制”(copy-on-write)模型,使修改應用程式也非常迅速,可以說達到了“随心所至,代碼即改”的境界。

随後,就可以建立容器來運作應用程式了。大多數docker容器隻需不到1秒鐘即可啟動。由于去除了管理程式的開銷,docker容器擁有很高的性能,同時同一台主控端中也可以運作更多的容器,使使用者可以盡可能充分地利用系統資源。

1.1.2 職責的邏輯分離

使用docker,開發人員隻需要關心容器中運作的應用程式,而運維人員隻需要關心如何管理容器。docker設計的目的就是要加強開發人員寫代碼的開發環境與應用程式要部署的生産環境的一緻性,進而降低那種“開發時一切都正常,肯定是運維的問題”的風險。

1.1.3 快速、高效的開發生命周期

docker的目标之一就是縮短代碼從開發、測試到部署、上線運作的周期,讓你的應用程式具備可移植性,易于建構,并易于協作。

1.1.4 鼓勵使用面向服務的架構

docker還鼓勵面向服務的架構和微服務架構[1]。docker推薦單個容器隻運作一個應用程式或程序,這樣就形成了一個分布式的應用程式模型,在這種模型下,應用程式或服務都可以表示為一系列内部互聯的容器,進而使分布式部署應用程式,擴充或調試應用程式都變得非常簡單,同時也提高了程式的内省性。

注意

如果你願意,當然不必拘泥于這種模式,你可以輕松地在一個容器内運作多個程序的應用程式。

繼續閱讀