1. 程式人生 > >容器與虛擬機器雙城記

容器與虛擬機器雙城記

自容器技術誕生以來,幾乎每個接觸到容器的人都對容器與虛擬機器的共性和差異產生巨大的疑問。今天我們為讀者們帶來了 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 主機和“老式”虛擬機器進行混合與匹配,系統管理程式可以確保在已有的物理硬體基礎上,實現系統整體的最大化利用。

tImVj_1Pbqv0HJDyMWTmBbnTzqrqzN7Y9aBZTaXoQ8Q=

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

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

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

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

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

容器化就是利用主機作系統的核心,來執行根檔案系統。這些根檔案系統被稱作容器。

 6vzV1qRUSasJfpXfPJ_VGLnTzqrqzN7Y9aBZTaXoQ8Q=

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

qVIcKo4eVNKr1PR_s9fYVrnTzqrqzN7Y9aBZTaXoQ8Q=

容器和虛擬機器聯合的力量

容器可以在裸機伺服器上,在虛擬機器內,或者在公共雲服務商裡執行。Docker 引擎就是其獨家祕方。Docker 引擎是主機上的 Docker 安裝軟體,負責建立和執行容器。下面的圖片,左側展示了裸機服務端容器化的架構,右側展示了容器化和虛擬化結合後的架構。

q983T8muv_zrShMraSfabrnTzqrqzN7Y9aBZTaXoQ8Q=

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

-J8LKonedgvhI8b9k4s8vLnTzqrqzN7Y9aBZTaXoQ8Q=

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

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

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

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

 HJw8p_uMYiXHGQpbnqrctLnTzqrqzN7Y9aBZTaXoQ8Q=

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

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

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