虛擬化 VS 容器化(docker)

2021-10-09 20:14:40 字數 1651 閱讀 8278

以 docker 為代表的容器技術一度被認為是虛擬化技術的替代品,然而這兩種技術之間並不是不可調和的。作者分別列舉了容器技術以及虛擬化技術的優缺點,並提出將兩者結合取長補短的解決方案。

容器為應用程式提供了隔離的執行空間:每個容器內都包含乙個獨享的完整使用者環境空間,並且乙個容器內的變動不會影響其他容器的執行環境。為了能達到這種效果,容器技術使用了一系列的系統級別的機制諸如利用linux namespaces來進行空間隔離,通過檔案系統的掛載點來決定容器可以訪問哪些檔案,通過cgroups來確定每個容器可以利用多少資源。此外容器之間共享同乙個系統核心,這樣當同乙個庫被多個容器使用時,記憶體的使用效率會得到提公升。

對於系統虛擬化技術來說,虛擬層為使用者提供了乙個完整的虛擬機器:包括核心在內的乙個完整的系統映象。cpu虛擬化技術可以為每個使用者提供乙個獨享且和其他使用者隔離的系統環境,虛擬層可以為每個使用者分配虛擬化後的cpu、記憶體和io裝置資源。哪家強?通常來說,這取決於你的需求。如果你只是希望將應用執行的例項進行隔離,那麼對於管理應用執行環境、啟動應用例項以及控制資源開銷方面容器將是乙個極為高效的工具。像docker這一類的容器,其設計原則就是為了解決這種應用環境的修改以及應用部署的問題,並且這十分符合devops理念(你可能希望知道更多關於devops理念的內容)。

如果你從伺服器虛擬化的角度來尋找最好的環境隔離方案,那麼系統級的虛擬化是更好的方案:和容器相比,鄰居租戶(noisy neighbours )對系統的影響在虛擬化的方案下將不是乙個問題。儘管現在很多容器都在專注於提高其隔離能力,但是虛擬機器的隔離還是要優於容器。從物理伺服器過渡到虛擬伺服器是乙個很自然的過程,並且現在針對虛擬伺服器的管理的生態系統也很完善。

在z系統中,linux具有很好的伸縮性(執行容器),但是z是乙個極度高效虛擬化(執行虛擬伺服器)的平台,它繼承了整個系統架構。儘管沒有精確的測量,將虛擬化和容器技術相結合,在z系統中會比其他平台要容易。

還有第三條路:兩者兼而有之。

有多種方式可以將系統虛擬化及容器技術相結合:

1.乙個容器中執行乙個虛擬機器

docker在部署容器方面十分靈活。其中乙個選擇(execution driver)是利用kvm映象。這樣就可以在最好的隔離性情況下發揮devops所擅長的使用docker各種方式。但是這也付出了需要在啟動容器時啟動整個作業系統例項的代價。這也就意味著較長的啟動時間以及低效的記憶體使用,只能通過核心共享記憶體(ksm)來提公升記憶體利用率。這種方法效果和效率都不理想,但是這是乙個好的開始。

2.乙個虛擬機器中執行乙個容器

與之相反的,你一可以在虛擬機器中啟動乙個容器。這裡的虛擬機器並不是由docker控制,而是通過現有的虛擬化管理設施來控制。一旦系統例項啟動,就可以通過docker來執行容器而**其他特殊的設定。同時,由於不同容器執行在不同的虛擬機器上,容器之間也能有很好的隔離。而記憶體的使用率需要通過虛擬層的記憶體共享來提公升。

2b.乙個虛擬機器中執行多個容器

對於多租戶的情況,可以用另一種形式在虛擬機器中執行docker。這種情況下,我們假設在不同租戶的容器之間需要強隔離,而對於同一使用者的不同容器,簡單的linux容器隔離已經足夠。這樣我們就可以在減少虛擬機器個數的情況下保證租戶之間的隔離,同時可以利用docker帶來的各種便利。

總結來說:需要根據實際需求進行選擇。

想試試docker?到這裡一鍵開通試用下吧: 

devops linux kvm 虛擬化 c++ docker 容器

分享到  

全部回答(1)

虛擬化 VS 容器化

本文講的是虛擬化 vs 容器化,編者的話 以 docker 為代表的容器技術一度被認為是虛擬化技術的替代品,然而這兩種技術之間並不是不可調和的。作者分別列舉了容器技術以及虛擬化技術的優缺點,並提出將兩者結合取長補短的解決方案。容器為應用程式提供了隔離的執行空間 每個容器內都包含乙個獨享的完整使用者環...

docker容器虛擬化

network namespace 是 linux 核心提供的功能,是實現網路虛擬化的重要功能,它能建立多個隔離的網路空間,它們有獨自網路棧資訊。不管是虛擬機器還是容器,執行的時候彷彿自己都在獨立的網路中。而且不同network namespace的資源相互不可見,彼此之間無法通訊。假如我們的物理機...

Docker容器虛擬化

network namespace 是 linux 核心提供的功能,是實現網路虛擬化的重要功能,它能建立多個隔離的網路空間,它們有獨自網路棧資訊。不管是虛擬機器還是容器,執行的時候彷彿自己都在獨立的網路中。而且不同network namespace的資源相互不可見,彼此之間無法通訊。假如我們的物理機...