容器是數據中心創新領域最熱門的潮流,盡管不是參與討論的每個人都能準確地闡明具體原因。如果你想知道容器是不是適合自己的數據中心戰略,或者如果你知道容器適合數據中心戰略,但需要有法子向同行解釋容器,那么這篇指南正適合你。
從最基本的層面上來講,容器讓你可以將更多的計算工作負載塞入到單單一臺服務器上,并且讓你可以在一瞬間為新的計算任務提高增加容量。從理論上來說,這意味著你可以購買較少的硬件,自建或租賃較少的數據中心場地,并且雇用較少的人手來管理這些設備。容器不同于虛擬機――你可能早已在使用VMware或Hyper-V虛擬化軟件或者KVM或Zen等開源解決方案,運行虛擬機。我們會在下面解釋一些差異。
具體來說,Linux容器為服務器上運行的每個應用程序提供了獨自、隔離的環境來運行,但是那些容器都共享主機服務器的操作系統。由于容器沒很必要裝入操作系統,你可以在一瞬間為虛擬機建立容器,而不是要花數分鐘。如果應用程序遇到業務活動突然猛增的情況,比如人們進行更多次搜索或訂購更多個產品,這樣的速度讓數據中心能夠非常迅速地響應。
下面是容器方面需要了解的九個基本事實。如果你有另外的基本事實需要補充,歡迎留言交流!
1. 容器不同于虛擬機。
想比較容器和虛擬機,一個辦法就是看一看各自的優點:容器具有輕量級特性,所需的內存空間較少,提供非??斓膯铀俣龋摂M機提供了專用操作系統的安全性和更牢固的邏輯邊界。如果是虛擬機,虛擬機管理程序與硬件對話,就如同虛擬機的操作系統和應用程序構成了一個單獨的物理機。虛擬機中的操作系統可以完全不同于主機的操作系統。
容器提供了更高級的隔離機制,許多應用程序在主機操作系統下運行,所有應用程序共享某些操作系統庫和操作系統的內核。已經過證明的屏障可以阻止運行中的容器彼此沖突,但是這種隔離存在一些安全方面的問題,我們稍后會探討。
容器和虛擬機都具有高度可移植性,但方式不一樣。就虛擬機而言,可以在運行同一虛擬機管理程序(通常是VMware的ESX、微軟的Hyper-V或者開源Zen或KVM)的多個系統之間進行移植。而容器不需要虛擬機管理程序,因為它與某個版本的操作系統綁定在一起。但是容器中的應用程序可以移到任何地方,只要那里有一份該操作系統的副本。
容器的一大好處就是應用程序以標準方式進行了格式化,之后才放到容器中。開發人員可以使用同樣的工具和工作流程,不管目標操作系統是什么。一旦在容器中,每種類型的應用程序都以同樣的方式在網絡上移動。這樣一來,容器酷似虛擬機,它們又是程序包文件,可以通過互聯網或內部網絡來移動。
我們已經有了Linux容器、Solaris容器和FreeBSD容器。微軟正與Docker(同名開源容器項目背后的公司)合作,開發Windows容器。
Docker容器里面的應用程序無法遷移到另一個操作系統。確切地說,它能夠以標準方式在網絡上移動,因而更容易在數據中心內部或數據中心之間移動軟件。單一容器總是與單一版本的操作系統內核關聯起來。
2. 容器不如虛擬機來得成熟。
如今容器與虛擬機之間一個顯眼的區別就是,虛擬機是一項高度發展、非常成熟的技術,事實證明可以運行最關鍵的業務工作負載。虛擬化軟件廠商已開發出了能處理成千上萬個虛擬機的管理系統,那些系統旨在適合企業數據中心的現有運營。
容器更具有未來感――這種大有希望的新興技術未必解決了每一個困難。開發人員正在開發相應的管理系統,以便一啟動就將屬性分配給一組容器,或者將要求相似的容器分成一組,以便組成網絡或加強安全,但是這類系統仍在開發之中。
Docker最初的格式化引擎正成為一種平臺,并附有許多工具和工作流程。而容器獲得了一些大牌技術廠商的支持。IBM、紅帽、微軟和Docker在去年7月都加入了谷歌的Kubernetes項目,這個開源容器管理系統可用于將諸多Linux容器作為單一系統來管理。
Docker有730家廠商為其容器平臺貢獻代碼。CoreOS是一款旨在運行現代基礎設施堆棧的Linux發行版,它將廣大開發人員的目光吸引到了Rocket,這是一種新的容器運行時環境。
3. 容器可以在幾分之一秒內啟動。
創建容器的速度比虛擬機要快得多,那是由于虛擬機必須從存儲系統檢索10GB至20GB的操作系統。容器中的工作負載使用主機服務器的操作系統內核,避免了這一步。谷歌云平臺解決方案全球主管Miles Ward表示,容器可以在二十分之一秒內啟動完畢。
擁有這么快的速度讓開發團隊可以激活項目代碼,以不同的方式測試代碼,或者在其網站上推出額外的電子商務容量――這一切都非???。
4. 容器已在大規模環境證明了自身的價值,比如在谷歌搜索中。
谷歌搜索(Google Search)是世界上實施Linux容器的最龐大系統,谷歌將它用于內部運營。谷歌還擅長將容器托管在其應用引擎(App Engine)或計算引擎(Compute Engine)服務中,但是與其他云供應商一樣,谷歌將來自不同客戶的容器放入到單獨的KVM虛擬機中,因為虛擬機之間的界限更清晰。
然而想運行谷歌搜索操作,它自己使用容器,每秒啟動約7000個容器,每周就相當于約20億個。谷歌支持世界各地不同地方的搜索,在每個數據中心的活動量有高有低,這取決于時間段和影響所在地區的事件。容器是谷歌搜索引擎確保速度快、順暢運營的秘訣之一。這種例子只會促進世人對容器的興趣越來越大。
5. IT人員稱容器為“輕量級”時,實際含義如下:
涉及容器的“輕量級”是指,雖然幾十個虛擬機可以放在單單一臺主機服務器上,每個虛擬機用自己的操作系統運行應用程序,幾百個乃至幾千個容器可以裝入到主機上。容器化應用程序共享主機的操作系統內核以執行工作。因而,容器帶來了這種希望:就需要的場地和耗用的電力而言,有望成為理想的密集計算形式。
在過去十年間,虛擬化徹底改變了每臺服務器運行一種應用的行事方式。同樣道理,容器有望至少改變一些虛擬化工作負載,成為一種還要密集的計算形式。
6. 容器引發了安全方面的問題。
那么,容器完全只有好處嗎?別急著下結論?,F在發表的有關在一臺服務器上并排運行多個(比如1200個)容器的安全性方面的研究并不多。一個運行中的容器無法闖入或窺視另一個容器已分配的內存空間。
但是,如果允許兩個容器彼此對話,其中一個容器被裝入了惡意代碼,窺視被允許查看的數據當中的加密密鑰,那又會怎樣?由于共享內存里面存在太多的變數,寶貴數據(比如用戶ID、密碼和加密密鑰)遲早會落到惡意軟件的手中。
惡意代碼還可能逐漸了解大體情況,知道一個或多個關聯的容器在干什么。從理論上來說,這不會發生,因為容器旨在確保每個應用程序相互隔離。但是沒有人確信計算機科學家是否想到并杜絕了可能出現某種惡意軟件窺視行為的每一種情況。
彼此鄰近的容器共享處理器、內存和磁盤等資源,這種行為讓安全專業人員深為擔憂。有人可能找到一種方法,讓一個容器中的代碼設法窺視或竊取另一個容器中的數據,盡管之前還沒有人這么做過。
7. Docker已成為容器的代名詞,但它不是唯一的提供者。
Docker這家公司提出了一種標準的方法來構建容器工作負載,那樣工作負載就可以四處移動,但是在任何支持容器的環境中以易于預測的方式來運行。
無論是基于Linux的Docker容器、Solaris Zone還是FreeBSD Jail,所有容器都為在多應用程序主機上運行的應用程序提供某種隔離機制。既然如此,眼下我們為什么聽到的除了Docker還是Docker呢?答案在于這個事實:Jail和Zone確實是容器領域的開拓者,但是它們的采用很有限,這歸咎于這個事實:使用Solaris和FreeBSD操作系統的公司比較少。它們仍在企業得到使用,但是在公有云環境下只是稍微得到使用。
谷歌和開發Linux控制組(Linux Control Groups)的開發人員成功地將容器功能添加到Linux內核中后,鑒于Linux幾乎遍地開花的態勢,容器立馬進入到了每一個企業和政府數據中心。
Docker這家公司大概也在同一時間成立。開發人員明白,如果有一種統一的方法來創建并移動容器,而不是有五花八門的容器格式化引擎,那么容器的實用性和移植性就會大大加強。眼下,Docker就是那種事實上的標準。
正如Docker的首席執行官Ben Golub喜歡說的那樣,Docker就好比船運集裝箱。每家貨運公司、鐵路公司和船廠都知道如何裝卸和移動標準的船運集裝箱。Docker容器在一系列廣泛的計算環境下同樣備受歡迎。
8. 容器能節省IT人力,加快更新,也許是這樣。
在容器中運行生產代碼有個優點。Docker構建工作負載時,它采用的方式是以特殊的順序對文件排序,這個順序體現了它們的啟動次序。
一個服務或一部分應用程序邏輯需要在另一個之前啟動,容器實際上用多層來創建,那些層可以彼此獨立地訪問。已知只影響一層的代碼更改可以在不影響其他層的情況下執行。這樣一來,代碼更改起來比在典型的整體式應用程序中來得安全;在后者當中,一個錯誤會讓整個應用程序陷入停頓。
有了容器,還更容易修改應用程序。如果某一個層出現變化,可以在進行測試后投入到生產環境。如果某個問題出現,就可以迅速回滾/恢復,因為開發人員面對的只有一層。
與此同時,大型應用程序可以分解成許多小型應用程序,每個小應用程序都在各自的容器里面。打折奢侈品網站Gilt把七個大型應用程序分解成了300個微服務,一支小隊伍維護每個服務。據首席技術官Michael Bryzek聲稱,相比大型應用程序,這些服務可以更頻繁、更安全地更新。
9. 容器仍面臨一些沒有解決的問題。
Containers及大力支持它的廠商Docker勢必要克服一些潛在的問題,才能得到大眾的采用。正如最初設想的那樣,Docker原本對單一計算機上運行的應用程序而言是一種格式化引擎。一個容器或一系列關聯容器仍會一起駐留在單一主機上。要是應用程序需要10臺服務器、100臺服務器、乃至1000臺服務器,哪會怎樣?
Docker仍需要考慮在一個計算機上運行的一個應用程序,但是大型企業IT部門(想想跨國銀行、能源公司、汽車廠商和零售商)想要知道一種工具能處理龐大規模。
谷歌解決這個問題的辦法就是,建立了自己的多容器管理系統,該系統的核心現在成為了開源Kubernetes項目。Kubernetes讓IT部門可以建立運行容器的集群,提供了聯網功能和容器命名系統,讓容器管理員可以同時管理多得多的容器。它讓容器管理員可以跨諸多計算機運行多個容器中的大型 應用程序,不需要知道容器集群管理的所有細枝末節。
該項目只是自去年7月以來才在開發開源代碼,所以還有一段路要走。但值得注意的是,谷歌將運行其業務所特有的代碼放到了公眾領域。IBM、紅帽和微軟還有幾十家主攻容器運營的初創企業對此極有興趣。VMware同樣對Kubernetes有興趣,而且熱衷于跟Docker合作,確保其虛擬化環境與容器很好地協同運行。企業用戶最終會看到這一切活動的成效。
結束語
有些人在不斷尋求性能更好、速度更快、成本更低的計算技術,他們會發現容器有許多可圈可點之處。運行單個應用的老式x86服務器的處理器其利用率充其量也就在10%到15%左右。虛擬化服務器將利用率提高到了40%、50%,個別情況下甚至可以提高到60%。
容器有望進一步提高處理器的利用率,降低計算成本,并且讓硬件、電力和場地方面的投入獲得更大的回報。容器還帶來了這種威脅:如果哪里出了問題,比如說安全漏洞,它可能帶來的后果會慘重得多。這就是為什么切忌倉促到處采用容器。容器仍是值得使用的技術,不過要謹慎使用;需深思熟慮,而不是貿然行動。