容器與虛擬機雙城記

freu7797 8年前發布 | 13K 次閱讀 虛擬化 Docker

自容器技術誕生以來,幾乎每個接觸到容器的人都對容器與虛擬機的共性和差異產生巨大的疑問。今天我們為讀者們帶來了 DaoCloud 獨家翻譯的三篇精選文章,為大家抽絲剝繭地分析容器和虛擬機之間的差異,并且教會你如何聯合 Docker 容器和虛擬機的力量來取得更佳的資源利用率。

  1. 容器可不是虛擬機 ——解釋了 Docker 容器和虛擬機的技術差異。
  2. 容器與虛擬機并存 ——講述如何聯合 Docker 容器和虛擬機來幫助用戶優化基礎設施。
  3. 虛擬化管理員的容器化之路 ——提煉了關于以「虛擬化管理員的容器化之路」為主題的在線研討會的核心內容。

( 以上原文鏈接國內或許不能訪問后進入)

1. 容器可不是虛擬機

在 Docker 工作期間,我花了相當多的時間去和社區成員交流,我發現,不論對 Docker 是陌生還是熟悉,大家都有一個共同點:在第一次使用 Docker 時,人們會不由自主地像使用虛擬機那樣,嘗試去構建它。我都記不清有多少次聽到別人說 Docker 就是“輕量級的虛擬機”了。

我很有同感,因為在第一次使用 Docker 工作時,我也干過一模一樣的事。人們很容易產生聯想,覺得這些技術肯定有一些共通性: 兩者 都是用來為運行應用提供封閉的環境 。而且, 兩者的環境都是通過二進制生成品來呈現的,可以在主機間移動切換 。也許還會有其他相似處,但對我而言這兩點是最大頭的。

區別這兩者的關鍵是, 兩者的底層架構是完完全全不同的 。我的類比是(如果你認識我,就知道我很喜歡類比):

虛擬機就像是房子,而容器就 像是公寓

房子(虛擬機)是完全自我封閉的,能防止不速之客。它們還各自擁有自己的基礎設施——水管、供暖、電力等等。不僅如此,在絕大多數情況下,房子都要有至少一間臥室、一個客廳、一間浴室和一間廚房。我還會找到一間“工作室”——就算我買的是最小的房子,我也會買一些超出需要的東西,因為房子就是這么建的(學究氣一點,的確我忽略了當代流行的“蝸居”,因為它破壞了我的類比)。

公寓(容器)也能提供保護,阻止不速之客,但它們都是圍繞共享基礎設施建成的。公寓樓( Docker 主機)共用水管、供暖和電力等等。此外,公寓的尺寸面積是參差不齊的——從小的工作室,到帶多個臥室的頂層豪華套房。你需要什么,就出錢租什么。最后,和房子一樣,公寓也有上鎖的前門來擋住不速之客。

使用容器,你將共用 Docker 主機的底層資源,你運行應用需要什么鏡像,你就創建什么鏡像。你會從一個基礎系統開始,然后需要什么,就往上添加什么。虛擬機走的是相反的路子。你開始時有一個完整的操作系統,然后根據你的應用需求,剔除掉你用不上的東西。

我確定,你們很多人到這里會說“哦,我懂了,它們是不一樣的”。不過就算我們這么講,我們還是會把使用虛擬機養成的習慣帶到容器里去。

“我怎么備份容器?”

“我運行中的容器有什么補丁管理策略?”

“應用服務器在哪里運行?”

對我而言,當我意識到 Docker 并不是一種虛擬化技術時,真是眼前一亮,豁然開朗。 它其實是一種應用交付技術 。在以虛擬機為中心的世界里,抽象化的單位是單體虛擬機,它不僅存儲應用編碼,還經常存儲其狀態數據。虛擬機把物理服務器上跑的所有東西都拿來,然后打包成一個單一的二進制文件,所以它可以到處移動。但是萬變不離其宗,東西還是原來的東西。在容器的世界里,抽象化的單位是應用本身;或者更準確的說,是幫助構成應用的服務。

在容器世界里,一般多個服務(各自代表一個單一的容器)組成一個應用。應用現在可以被分解成許多更小的組件,這將徹底改變它們在產品中被管理的方式。所以,你怎么備份你的容器呢?你不需要備份。你的數據不存在于容器里,它存在于一個命名的存儲卷中,能在你定義的 1 到 N 個容器間共享。你只需備份數據卷,不必管容器。 理想情況下,你的容器是無狀態的,而且是不可改變的。

誠然,補丁仍然是你世界的一部分,但它們不作用于運行中的容器。事實上,如果你修補一個運行中的容器,然后在一個未修補的鏡像上開啟新的容器,那接下來有你好受的了。理想的做法應當是, 升級你的 Docker 鏡像,停止運行中的容器,之后再運行新的容器 。因為容器可以在一秒之內啟動,這樣做其實會節省很多。

你的應用服務器會轉換成一個在容器內部運行的服務。當然,有時候你基于微服務的應用需要連接到一個非容器服務,不過絕大多數獨立服務器(也就是你執行代碼的服務器)會給一個或多個容器提供通路。容器能用少得多的額外花銷,提供相同質量的運行效果(而且橫向拓展也會好得多)。

 “但是,虛擬機已經被遷移了, 我怎么處理我已有的應用呢?”

我經常被人問到如何在一個容器里運行大型單體應用。我的建議是使用微服務——有很多有效的策略可以轉移到微服務架構(微服務架構一開始就會把現存的單體應用從虛擬機轉向容器),但我覺得這應該是旅途的第一步,而不是最終的目的地。

如果你想著你的團隊如何能利用好 Docker,請試著拋棄用慣虛擬機而形成的思維定勢,早日意識到 Docker 遠遠超越了“輕量級虛擬機”的范疇 。它是一種新的方式,能在你所選擇的基礎架構上,以應用為中心,提供性能強悍,規模可拓展的應用。

2.容器與虛擬機并存

若干星期之前,我談到了為什么 Docker 容器不等同于虛擬機( VM )。在文章的后面,我收到了相當多的積極反饋(在此謝過!),不過也聽到了一個很普遍的問題:虛擬機和 Docker 容器能不能并存呢?答案是——

“可以!”

“可以!”

“可以!”

重要的事情說三次。

在最基礎的層面上,虛擬機是 Docker 主機運行的絕佳場所——而這里所說的虛擬機,當然是指任何形式的虛擬機。不管是 vSphere 虛擬機,Hyper-V 虛擬機還是 AWS EC2,它們全都可以無差別地作為 Docker 主機來運行。根據你的實際需要,虛擬機或許是安放那些容器的最理想之地。然而,Docker 的偉大之處恰恰在于,在哪兒運行容器都不是問題——完全按照你的想法來就行。

我聽到的另一個問題是: 基于 Docker 容器的服務是否能夠和基于虛擬機的服務發生交互 。這一次,答案還是妥妥的“可以”。在一套 Docker 容器上運行你的應用,并不妨礙它與虛擬機里運行的服務進行交流。

舉個例子,你的應用可能需要和內置于某個虛擬機的數據庫進行交互。假設網絡什么的一切正常,你的應用是可以和數據庫無縫交互的。

虛擬機和 Docker 容器可以進行協同工作的另一個領域,是容量優化。虛擬機之所以能先行一步占領大半江山,靠的就是高人一等的服務器利用率。直到今天,這一點依然是沒有改變的。比如說,vSphere 主機能掌控一個可以裝下 Docker 主機的虛擬機,但也能掌控任何數量的傳統單個虛擬機。通過對 Docker 主機和“老式”虛擬機進行混合與匹配,系統管理程序可以確保在已有的物理硬件基礎上,實現系統整體的最大化利用。

Docker 允許在相當多種類的虛擬化與云平臺上運行 Docker 主機。不管在哪里運行,Docker 云和 Docker 數據中心都可以輕易管理 Docker 主機。再輔以 Docker Machine,你可以把新的 Docker 主機安放到包括 VMware、vSphere、微軟 Hyper-V、Azure 和 AWS等一系列各類平臺上。

Docker 最強大的一點,就是 它能為 IT 團隊提供非比尋常的靈活性 。決定在哪里運行應用,可以 100% 取決于你們團隊的實際需求。你絕不會受困于單一的基礎架構,你可以用任何適合你團隊的方式來挑選,來抉擇,來混合,來匹配。把 Docker 主機放在 vSphere 上?善哉。放在 Azure 上?可以。放在物理服務器上?當然沒問題。有了 Docker 容器,你就擁有了靈活性、便捷性和可控性的完美結合方案。

3.虛擬化管理員的容器化之路

如果你是一名虛擬化管理員,那么最近幾個月提出的“容器”絕對是你的良機。原因是:現在的企業,無論規模大小,都在試圖利用容器化的強大力量。不過,容器化是什么呢?你又該如何利用好容器,同時兼顧好你在虛擬化領域的投資呢?

昨天,我們圍繞“虛擬化管理員的容器化之路”問題開展了一場網絡研討會,有超過 1100 名使用者參加。不過,我們可以概括一下所討論的主題——

容器化就是利用主機作系統的內核,來運行根文件系統。這些根文件系統被稱作容器。

容器會把應用,以及運行應用所需的一切文件(比如二進制文件)打包進一個單一的標準化單位(又稱作“容器”)。這個標準格式允許容器化了的應用在任何環境下運行,無需考慮基礎架構。有一點很重要,需要注意: 容器并不是虛擬機 。容器比虛擬機更加輕量化,更加便攜。容器利用共享資源,而不是像虛擬機那樣,端著整個客戶操作系統。容器化不需要專門的系統管理程序。下圖可以對照看看容器化(左側)和虛擬機(右側)的架構異同。

容器和虛擬機聯合的力量

容器可以在裸機服務器上,在虛擬機內,或者在公共云服務商里運行。Docker 引擎就是其獨家秘方。Docker 引擎是主機上的 Docker 安裝軟件,負責創建和運行容器。下面的圖片,左側展示了裸機服務端容器化的架構,右側展示了容器化和虛擬化結合后的架構。

通過利用容器化和虛擬化的結合,企業團隊可以從原來的,每臺虛擬機只能運行一個應用,到如今在一臺虛擬機上運行多個應用。管理者可以把各個服務放置到一個容器里,然后在各臺虛擬機上運行多個容器。

看吶!它能讓管理者合并手中的虛擬機(現在每臺虛擬機都更強大了),減少總體花費(維護、hypervisor 許可、存儲等等),并且用更快的性能速度運行應用(別忘了容器比虛擬機更輕量化),從而實現環境的整體優化。

瑞士最大的電信供應商瑞士電信就是這種結合的主要受益者。該公司以前需要在 400 臺虛擬機上運行 400 個應用,引入容器化后,如今運行同樣的 400 個應用卻只需要 20 臺虛擬機!這讓他們在存儲、日常維護和 hypervisor 許可上節省了一大筆開銷。

容器化還允許團隊從一個環境 向另一個環境輕松遷移工作負載。

下面是一個示例,展示了一個運行在 VMware vSphere 上的工作負載是如何轉移到 Azure 上的。

在網絡研討會上,技術專員邁克·科勒曼用一個技術 demo 展示了如何利用我們的 Docker 數據中心解決方案和虛擬化技術,把一個創意變成應用產品。也建議你看看研討會后期的問答環節,參與者在會上提出了許許多多相當棒的問題,我們對其中一些問題作出了解答。

現在,問題不是“容器和虛擬機有什么區別”了,問題是——

“在你的環境下,你如何開始利用容器?”

 

來自:http://blog.daocloud.io/dockervsvm/

 

 本文由用戶 freu7797 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!