容器為應用程序提供了隔離的運行空間:每個容器內都包含一個獨享的完整用戶環(huán)境空間,并且一個容器內的變動不會影響其他容器的運行環(huán)境。為了能達到這種效果,容器技術使用了一系列的系統(tǒng)級別的機制諸如利用Linux namespaces來進行空間隔離,通過文件系統(tǒng)的掛載點來決定容器可以訪問哪些文件,通過cgroups來確定每個容器可以利用多少資源。此外容器之間共享同一個系統(tǒng)內核,這樣當同一個庫被多個容器使用時,內存的使用效率會得到提升。
對于系統(tǒng)虛擬化技術來說,虛擬層為用戶提供了一個完整的虛擬機:包括內核在內的一個完整的系統(tǒng)鏡像。CPU虛擬化技術可以為每個用戶提供一個獨享且和其他用戶隔離的系統(tǒng)環(huán)境,虛擬層可以為每個用戶分配虛擬化后的CPU、內存和IO設備資源。
(題圖來自:securenetworksitc.com)
哪家強?通常來說,這取決于你的需求。如果你只是希望將應用運行的實例進行隔離,那么對于管理應用運行環(huán)境、啟動應用實例以及控制資源開銷方面容器將是一個極為高效的工具。像Docker這一類的容器,其設計原則就是為了解決這種應用環(huán)境的修改以及應用部署的問題,并且這十分符合DevOps理念(你可能希望知道更多關于DevOps理念的內容)。
如果你從服務器虛擬化的角度來尋找最好的環(huán)境隔離方案,那么系統(tǒng)級的虛擬化是更好的方案:和容器相比,鄰居租戶(Noisy neighbours )對系統(tǒng)的影響在虛擬化的方案下將不是一個問題。盡管現(xiàn)在很多容器都在專注于提高其隔離能力,但是虛擬機的隔離還是要優(yōu)于容器。從物理服務器過渡到虛擬服務器是一個很自然的過程,并且現(xiàn)在針對虛擬服務器的管理的生態(tài)系統(tǒng)也很完善。
在z系統(tǒng)中,Linux具有很好的伸縮性(運行容器),但是z是一個極度高效虛擬化(運行虛擬服務器)的平臺,它繼承了整個系統(tǒng)架構。盡管沒有精確的測量,將虛擬化和容器技術相結合,在z系統(tǒng)中會比其他平臺要容易。
還有第三條路:兩者兼而有之。
有多種方式可以將系統(tǒng)虛擬化及容器技術相結合:
1.一個容器中運行一個虛擬機Docker在部署容器方面十分靈活。其中一個選擇(execution driver)是利用KVM鏡像。這樣就可以在最好的隔離性情況下發(fā)揮DevOps所擅長的使用Docker各種方式。但是這也付出了需要在啟動容器時啟動整個操作系統(tǒng)實例的代價。這也就意味著較長的啟動時間以及低效的內存使用,只能通過內核共享內存(KSM)來提升內存利用率。這種方法效果和效率都不理想,但是這是一個好的開始。
2.一個虛擬機中運行一個容器
與之相反的,你一可以在虛擬機中啟動一個容器。這里的虛擬機并不是由Docker控制,而是通過現(xiàn)有的虛擬化管理設施來控制。一旦系統(tǒng)實例啟動,就可以通過Docker來運行容器而武器其他特殊的設置。同時,由于不同容器運行在不同的虛擬機上,容器之間也能有很好的隔離。而內存的使用率需要通過虛擬層的內存共享來提升。
對于多租戶的情況,可以用另一種形式在虛擬機中運行Docker。這種情況下,我們假設在不同租戶的容器之間需要強隔離,而對于同一用戶的不同容器,簡單的Linux容器隔離已經(jīng)足夠。這樣我們就可以在減少虛擬機個數(shù)的情況下保證租戶之間的隔離,同時可以利用Docker帶來的各種便利。
總結來說:需要根據(jù)實際需求進行選擇。
本文永久更新鏈接地址:http://www.linuxidc.com/Linux/2015-04/116521.htm