幾乎當下任何一個高科技公司,都把投資建設(shè)的目光放在容器技術(shù)上,比如谷歌、IBM和微軟。但這只是因為容器技術(shù)太時髦,并不意味著傳統(tǒng)虛擬機技術(shù)已經(jīng)過時。
沒錯,容器比虛擬機更能允許在有限的物理空間里安裝更多的應(yīng)用。以Docker為代表的容器技術(shù),在云計算或數(shù)據(jù)中心領(lǐng)域擊敗了虛擬機。虛擬機會占用大量的系統(tǒng)資源。每臺虛擬機不只是運行一個完整的操作系統(tǒng)副本,而是操作系統(tǒng)所需要運行的所有硬件虛擬副本,這會輕而易舉地增加CPU和內(nèi)存負擔。相反,容器需要的只是一套支持程序和數(shù)據(jù)庫的操作系統(tǒng),以及足夠的系統(tǒng)資源來運行特定的程序。這實際上意味著,利用容器技術(shù),你能在每臺服務(wù)器上運行多于虛擬機兩到三倍的應(yīng)用程序。除此之外,你可以利用容器創(chuàng)建一個便攜并且可持續(xù)的、用于開發(fā)/測試和部署的運行環(huán)境,這相比于虛擬機又是一處利好。
如果這些就是我在比較容器和虛擬機時能想到的一切,我會立刻為虛擬機寫一份訃告,宣告它的死訊。然而,還有很多比在服務(wù)器中放多少應(yīng)用程序更重要的事情。
容器技術(shù)的問題:安全
經(jīng)常被當下興高采烈的容器技術(shù)支持者們所忽視的最大問題,便是安全。Daniel Walsh是一位任職于紅帽的安全工程師,主要研究Docker和容器技術(shù),他指出:容器技術(shù)并不像看上去那么可靠。以應(yīng)用Libcontainers作為技術(shù)支持的Docker為例,在Linux系統(tǒng)的工作模式下,Libcontainers可以訪問五個命名空間:流程,網(wǎng)絡(luò),安裝,主機名和共享內(nèi)存。這固然很好、很強大,然而仍然有很多重要的Linux核心子系統(tǒng)不能被容器所兼容,包括所有的設(shè)備、SELinux、Cgroup以及/sys下的所有文件系統(tǒng)。這意味著,如果某位用戶或者應(yīng)用程序獲取了容器內(nèi)部的超級用戶權(quán)限,底層操作系統(tǒng)理論上可以被破解。這是一件非常糟糕的事情。
現(xiàn)在,出現(xiàn)了很多保護Docker和其它容器技術(shù)的措施。舉例來說,你可以將一個/sys文件系統(tǒng)設(shè)置為“只讀”,或者強制某個容器進程對特定的文件系統(tǒng)執(zhí)行“只寫”,抑或設(shè)置網(wǎng)絡(luò)命名空間以使其只能與特定的企業(yè)內(nèi)聯(lián)網(wǎng)交流信息。但是,這些辦法都不能從根本上解決問題,如此維護容器安全需要耗費你大量的時間和精力。
另一項安全問題是,很多人都在發(fā)布基于容器的應(yīng)用,其中的一些比另一些要更可惡。我們假設(shè)你和你的團隊有懶惰的傾向,你們不加辨別地安裝到手的第一個容器,然后不知不覺就為服務(wù)器帶入了木馬。你必須讓你的人明白,他們不能簡單地像從手機里的應(yīng)用商店下載游戲一樣,從網(wǎng)絡(luò)上下載應(yīng)用程序。他們這種毫無責任意識的行為,很可能為你的服務(wù)器帶來嚴重的安全隱患。
對于容器的其它擔憂
好,如果我們能解決容器的安全問題,那么容器技術(shù)就可以統(tǒng)治世界了,是這樣嗎?很抱歉,并非如此。事實上,你還需要考慮容器其它方面的問題。
RackN公司CEO,OpenStack基金會的董事成員Rob Hirschfeld認為,容器的包裝問題仍然棘手。創(chuàng)建一個加密箱能夠部分地幫助解決下游問題(你知道你有什么),而不是上游的問題(你不知道你依靠什么)。“將部署劃分成更多離散且獨立的功能分區(qū)的確是聰明的抉擇,但是這意味著你們要管理的部分也變得更多了。”
對此,我必須添加一句:這不僅是安全問題,也是一個質(zhì)量是否能夠保證的問題。固然,X容器可以運行NGINX網(wǎng)頁服務(wù),但是最終版本是你想要的嗎?它包含TCP負載均衡更新的功能嗎?在容器中部署應(yīng)用固然是很容易的事,但是如果你安裝了錯誤的容器,你最終在做的還是浪費時間。
Hirschfeld還指出,容器的擴展問題可以成為一個真正的難題。切記,容器的全部意義在于運行單個應(yīng)用。你在容器里添加的應(yīng)用功能越多,你從第一步開始使用虛擬機的可能性就越大。
在容器和虛擬機間做出抉擇
那么,你究竟該如何在容器和虛擬機間做出抉擇呢?Scott S. Lowe,一位虛擬機設(shè)計工程師,建議你考察你的“工作范圍”。換言之,如果你需要運行單個應(yīng)用程序的多個副本,比如MySQL, 你需要的就是容器。如果你需要靈活地運行多個復雜應(yīng)用,那么你需要的就是虛擬機。
除此之外, 容器往往會把你局限在一個特定的操作系統(tǒng)版本里。這也許是好事,如果你在容器中恰當?shù)剡\行了應(yīng)用程序,你就不必擔心它的依賴性——但是它同時也限制住了你。 如果你使用的是虛擬機的話, 不管你應(yīng)用的是什么管理程序——KVM, Hyper-V, vSphere, Xen,你都能非常得心應(yīng)手地運行任何操作系統(tǒng)。
你需要在最少的服務(wù)器上運行最大量的特定程序嗎?如果那就是你,那么你需要使用容器——記住,你需要密切關(guān)注在你的系統(tǒng)中運行著的容器,直至容器安全問題能夠最終得到保證。而如果你需要在服務(wù)器里運行許多個應(yīng)用程序,或者使用多種多樣的操作系統(tǒng),那么你最好使用虛擬機。如果安全問題是貴公司的第一要義,那么你現(xiàn)在仍然最好還是使用虛擬機。
在實際情況中,我希望我們中的大部分都能在我們的云計算和數(shù)據(jù)中心里同時運行容器和虛擬機。容器技術(shù)在經(jīng)濟上的優(yōu)勢讓任何人都無法忽視,然而虛擬機仍然擁有值得稱道的優(yōu)點。隨著容器技術(shù)的成熟, 我真正希望發(fā)生的事情是虛擬機和容器技術(shù)可以融合到一起,為云計算領(lǐng)域帶來實質(zhì)意義上的改變。我們目前還沒有做到,但是我們終有一天會做到。