虛擬化技術改變了現代計算方式,它能夠提升系統資源使用效率、消除應用程序和底層硬件之間的依賴關系,同時加強負載的可移植性和安全性。虛擬化實質上再現了整個物理服務器作為一個虛擬機運行一個應用,作用是抽象服務器資源,每臺虛擬機都能夠獲取唯一的操作系統和負載。不過虛擬機技術帶來的麻煩是每個實例都需要運行客戶端操作系統的完整副本以及其中包含的大量應用程序,由此會產生沉重的負載,這將會影響其工作效率及性能表現。在這樣的需求背景下,容器技術出現了。容器要比傳統虛擬化技術更高效,容器并非虛擬化或抽象整個硬件,而只是抽象應用或應用的部分,如此粒度的虛擬化意味著資源將不會浪費在冗余的部分,同時還可以降低CPU、內存和存儲需求,所以容器技術也是一種虛擬化技術。
容器虛擬化具有輕量級特性,所需的內存空間較少,提供非常快的啟動速度,創建容器的速度比虛擬機要快得多,那是由于虛擬機必須從存儲系統檢索10GB至20GB的操作系統,容器中工作負載使用主機服務器的操作系統內核,避免了這一步,容器可以在二十分之一秒內啟動完畢;容器虛擬化實現應用程序以標準方式進行格式化,之后才放到容器中。在容器中,每種類型的應用程序都以同樣的方式在網絡上移動。這樣一來,容器可以通過互聯網或內部網絡來移動;容器虛擬化提供了更高級的隔離機制,許多應用程序在主機操作系統下運行,所有應用程序共享某些操作系統庫和操作系統的內核,避免運行中的容器彼此沖突;容器虛擬化可以將一個大型的應用程序分解成許多小型應用程序,每個小應用程序都在各自的容器里面。比如:打折奢侈品網站Gilt就把七個大型應用程序分解成了300個微服務,一支小隊伍維護每個服務,如某一個微服務出現問題,可以迅速回滾/恢復。容器虛擬化技術安全度更高,容器之間可以彼此獨立地訪問。修改一層的代碼更改可以在不影響其他層的情況下執行。這樣一來,代碼更改起來比在典型的整體式應用程序中來得安全。
數據中心引入容器虛擬化技術也有其固有弊端,就是單個操作系統有可能引起影響所有相關實例的單點事故。比如,惡意軟件或者主機操作系統崩潰可能禁用或者影響所有容器,還有容器更容易完成遷移,但卻只能被遷移到具有兼容操作系統內核的其他服務器當中,這樣會無形中減少遷移選擇;彼此鄰近的容器共享處理器、內存和磁盤等資源,這種行為讓安全專業人員深為擔憂,與傳統虛擬化相比,面臨更為嚴峻的安全隱患。比如若允許兩個容器彼此對話,其中一個容器被裝入了惡意代碼,窺視被允許查看的數據當中的加密密鑰,各種機密數據可能會落到惡意軟件的手中;還有容器虛擬化技術的代表當屬Docker,Docker也不過才出現三年,在2014年Docker剛剛出來,所以到現在技術仍在不斷完善之中,而傳統虛擬機技術是一項高度發展、非常成熟的技術,早已在成千上萬的數據中心里使用著,數據中心在引入容器技術時都會有所顧忌。現在,只有在一些技術積累雄厚的大型互聯網公司才愿意嘗鮮容器技術,并不具有普遍意義;正是因為是新技術,所以用于監控和管理容器的工具種類也十分缺乏,目前只有谷歌開源Docker管理工具Kubernetes,很多時候還有借助于傳統虛擬化技術的工具,缺少容器專業管理工具。
容器技術為應用程序提供了隔離的運行空間,每個容器內都包含一個獨享的完整用戶環境空間,并且一個容器內的變動不會影響其他容器的運行環境。一個數據中心是采用傳統虛擬化技術還是容器技術,要考慮數據中心現實情況。如果從數據中心更關注服務器虛擬化的角度來尋找最好的環境隔離方案,那么傳統的系統級虛擬化是更好的選擇;如果數據中心需要將應用運行的實例進行隔離,那么對于管理應用運行環境、啟動應用實例以及控制資源開銷方面容器將是一個極為高效的工具,應該大膽選擇容器技術。不過雖然容器技術擁有很強的兼容性,但仍然不能完全取代現有的虛擬機環境,容器并不是一種能夠滿足所有虛擬化任務的解決方案,只是虛擬化工具箱提供的另外一種工具。所以數據中心要采用哪種虛擬化技術,一定要權衡利弊,找最適合自己的技術。當然,在一個數據中心,也可以兩種技術共存,這兩種技術并不是互斥的,只是適用的場合有所差異,各有利弊。如此便可以在不同的服務器中去部署兩種技術,以此來滿足不同的應用需要,通常容器虛擬化可以和傳統虛擬機很好地協同工作。