「運維」VMware 和 Docker 有什麼區別?

架構思考 發佈 2024-02-27T07:11:47.717341+00:00

VMware 和 Docker是虛擬化技術中兩種最具代表性的設計 。什麼是「虛擬化」顧名思義,虛擬是相對於現實而言。虛擬化(Virutualization)通常是指構造真實的虛擬版本。

VMware 和 Docker是虛擬化技術中兩種最具代表性的設計 。

什麼是「虛擬化」

顧名思義,虛擬是相對於現實而言。虛擬化(Virutualization)通常是指構造真實的虛擬版本。不嚴謹地說,用軟體模擬計算機,就是虛擬機;用數字模擬價值,就是貨幣;用存儲空間模擬物理存儲,就是虛擬磁碟。VMware 和 Docker 是目前虛擬化技術中最具代表性的兩種設計。VMware 為應用提供虛擬的計算機(虛擬機);Docker 為應用提供虛擬的空間,被稱作容器(Container)。

Docker則是 2013 年發布的一個社區產品,後來逐漸在程式設計師群體中流行了起來。大量程式設計師開始習慣使用 Docker,所以各大公司才決定使用它。目前K8s 下的容器主要還是 Docker。

虛擬機的設計

要虛擬一台計算機,要滿足三個條件:隔離、仿真、高效。

隔離(Isolation),指的是一台實體機上的所有的虛擬機實例不能互相影響。這也是早期設計虛擬機的一大動力,比如可以在一台實體機器上同時安裝 Linux、Unix、Windows、MacOS 四種作業系統,那麼一台實體機器就可以執行四種作業系統上的程序,這就節省了採購機器的開銷。

仿真(Simulation)指的是用起來像一台真的機器那樣,包括開機、關機,以及各種各樣的硬體設備。在虛擬機上執行的作業系統認為自己就是在實體機上執行。仿真主要的貢獻是讓進程可以無縫的遷移,也就是讓虛擬機中執行的進程,真實地感受到和在實體機上執行是一樣的——這樣程序從虛擬機到虛擬機、實體機到虛擬機的應用遷移,就不需要修改原始碼。

高效(Efficient)的目標是減少虛擬機對 CPU、對硬體資源的占用。通常在虛擬機上執行指令需要額外負擔 10~15% 的執行成本,這個開銷是相對較低的。因為應用通常很少將 CPU 真的用滿,在容器中執行 CPU 指令開銷會更低更接近在本地執行程序的速度。

為了實現上述的三種訴求,最直觀的方案就是將虛擬機管理程序 Hypervisor 作為作業系統,在虛擬機管理程序(Hypervisor)之上再去構建更多的虛擬機。像這種管理虛擬機的架構,也稱為 Type-1 虛擬機,如下圖所示:

我們通常把虛擬機管理程序(Virtual Machine Monitor,VMM)稱為 Hypervisor。在 Type-1 虛擬機中,Hypervisor 一方面作為作業系統管理硬體,另一方面作為虛擬機的管理程序。在 Hypervisor 之上創建多個虛擬機,每個虛擬機可以擁有不同的作業系統(Guest OS)。

Type-2 虛擬機

Type-1 虛擬機本身是一個作業系統,所以需要用戶預裝。為了方便用戶的使用,VMware 還推出了 Type-2 虛擬機,如下圖所示:

在第二種設計當中,虛擬機本身也作為一個進程。它和作業系統中執行的其他進程並沒有太大的區別。但是為了提升性能,有一部分 Hypervisor 程序會作為內核中的驅動執行。當虛擬機作業系統(Guest OS)執行程序的時候,會通過 Hypervisor 實現世界切換。

Hyper-V

隨著虛擬機的發展,現在也出現了很多混合型的虛擬機,比如微軟的 Hyper-v 技術。從下圖中你會看到,虛擬機的管理程序(Parent Partition)及 Windows 的核心程序,都會作為一個虛擬化的節點,擁有一個自己的 VMBus,並且通過 Hypervisor 實現虛擬化。

在 Hyper-V 的架構當中不存在一個主的作業系統。實際上,用戶開機之後就在使用虛擬機,Windows 通過虛擬機執行。在這種架構下,其他的虛擬機,比如用 VMware 管理的虛擬機也可以復用這套架構。當然,你也可以直接把 Linux 安裝在 Hyper-V 下,只不過安裝過程沒有 VMware 傻瓜化。

容器(Container)
虛擬機虛擬的是計算機,容器虛擬的是執行環境。每個容器都是一套獨立的執行環境,如下圖所示,容器直接被管理在作業系統之內,並不需要一個虛擬機監控程序。

和虛擬機有一個最大的區別就是:容器是直接跑在作業系統之上的,容器內部是應用,應用執行起來就是進程。這個進程和作業系統上的其他進程也沒有本質區別,但這個架構設計沒有了虛擬機監控系統。當然,容器有一個更輕量級的管理程序,用戶可以從網絡上下載鏡像,啟動起來就是容器。容器中預裝了一些程序,比如說一個 Python 開發環境中,還會預裝 Web 伺服器和資料庫。因為沒有了虛擬機管理程序在中間的開銷,因而性能會更高。而且因為不需要安裝作業系統,因此容器安裝速度更快,可以達到 ms 級別。

容器依賴作業系統的能力直接實現,比如:Linux 的 Cgroups(Linux Control Groups)能力,可以用來限制某組進程使用的 CPU 資源和內存資源,控制進程的資源能使用;另外Linux 的 Namespace 能力,可以設置每個容器能看到能夠使用的目錄和文件。

有了這兩個能力,就可以基本控制容器間的隔離,容器中的應用直接以進程的身份執行即可。進程間的目錄空間、 CPU 資源已經被隔離了,所以不用擔心互相影響。

虛擬機可以把一個完整的系統用若干個文件保存下來,因此遷移和複製都很容易。但是,與其啟動一個作業系統,還不如直接打開應用,因此以 Docker 為代表的容器逐漸發展了起來。容器雖然達到了虛擬機同樣的隔離性,創建、銷毀、維護成本都更低,但是從安全性考慮,還是要優先選用虛擬機執行作業系統。基礎設施是一件大事,比如作業系統會發生故障、任何應用都有可能不安全,甚至容器管理程序本身也可能出現問題。因此,現在更多的情況是 Docker 被安裝到了虛擬機上。

綜上,VMware 和 Docker 的區別就是:

VMware 模擬機器硬體,而 Docker 模擬運行應用程式的作業系統。Docker 是一種更輕量級的虛擬化技術,因為它不必模擬伺服器硬體資源。重點是抽象應用程式所需的環境,而不是物理伺服器。VMware,就像實際的機器硬體一樣,允許您安裝作業系統和其他需要完整伺服器的任務。

文章來源:https://www.duidaima.com/Group/Topic/ArchitecturedDesign/10242

關鍵字: