虛擬機器與容器的差異:虛擬化的層、核心、啟動速度、隔離強度與使用時機比較

兩者都是在一台電腦上,讓多個應用程式彼此隔離執行的機制,但虛擬化的層不同。虛擬機器由虛擬機器監視器(Hypervisor)以虛擬方式建立CPU、記憶體、磁碟、網路等硬體,並在其上讓每台虛擬機器執行包含核心在內的完整作業系統。容器則共用主機作業系統的核心,以命名空間、cgroups等核心功能,區隔行程能看到的內容與能使用的資源。容器不需啟動作業系統,因此較輕量、啟動也快;而在隔離強度與能執行的作業系統種類上,則是虛擬機器占優勢。在雲端,一般會組合兩者,例如在虛擬機器上執行容器。

項目虛擬機器(VM)容器(container)
虛擬化的層硬體。由虛擬機器監視器以虛擬方式建立CPU、記憶體、磁碟、網路裝置並加以分配作業系統。在主機的核心上,區隔行程能看到的內容(行程ID、網路、檔案系統等)與能使用的資源
作業系統核心每台虛擬機器執行各自包含核心的作業系統(客體作業系統)所有容器共用主機的核心。容器映像檔不包含核心
能執行的作業系統也能執行與主機不同種類的作業系統(例如在Linux主機上執行Windows)僅限能在主機核心上執行者。Linux容器需要Linux核心
映像檔大小包含整個作業系統,一般以GB為單位只有應用程式與所需的函式庫,一般比虛擬機器小得多
啟動速度從啟動作業系統開始,常需要數十秒到數分鐘只需啟動行程,速度快,一般在數秒內即可運作
隔離強度強。在硬體層級區隔,客體作業系統核心的問題不易波及其他虛擬機器比虛擬機器弱。因為共用核心,核心漏洞遭到利用時,可能影響主機與其他容器
資源效率每個客體作業系統都使用記憶體與CPU,一台能執行的數量較少沒有重複的作業系統,相同資源能執行更多
主要用途不同種類作業系統的共存、伺服器整合、IaaS的虛擬機器、需要強隔離的環境微服務、CI/CD中的測試與交付、以Kubernetes進行的大規模維運、讓開發與正式環境一致

數值為具代表性的大致參考值,會因世代或產品而異。

適用於什麼情況

虛擬機器
想執行與主機不同種類的作業系統時、想自由選擇核心版本與設定時,或與其他使用者共用同一台實體伺服器等需要強隔離時。
容器
想快速啟動、停止大量相同應用程式時,想從開發到正式環境都以同一個映像檔執行時,或想在一台機器上集中執行許多小型服務時。

常見問題

有了容器,還需要虛擬機器嗎?

要看用途。只是執行Linux應用程式時,多半用容器就足夠。但要執行其他種類的作業系統、想更換核心,或需要強隔離時,就需要虛擬機器。在雲端,容器多半在業者提供的虛擬機器上執行,兩者與其說是互相取代,不如說是搭配使用。

為什麼在Windows或macOS的電腦上也能執行Linux容器?

Linux容器需要Linux核心。因此,在Windows或macOS上執行Linux容器的工具,會在背後啟動輕量的Linux虛擬機器,並在其中執行容器。容器共用主機核心的性質不變,此時的主機就是虛擬機器中的Linux。

有方法能加強容器的隔離嗎?

以非管理者(root)的權限執行容器中的行程、移除不需要的權限、限制可使用的系統呼叫等,都能縮小遭到攻擊時的影響。需要更強的隔離時,也有為每個容器準備輕量虛擬機器,並在其中執行容器的方式。

虛擬機器監視器的第1型與第2型有什麼不同?

第1型(裸機型)直接在硬體上執行,並在其上執行虛擬機器。由於沒有多餘的層,效能與隔離較佳,用於伺服器與雲端。第2型(寄居型)以應用程式的形式在一般作業系統上執行,使用方便,常用於個人電腦上的開發與測試。

理解度檢測

關於虛擬機器監視器(hypervisor)類型的說明,下列何者正確?

  1. A有直接在硬體上運作的類型,也有在一般作業系統上以應用程式形式運作的類型
  2. B一定是在一般作業系統上以應用程式形式運作,不會直接在硬體上運作
  3. C沒有類型上的差異,全都不使用硬體而僅靠軟體運作
查看答案與解析

正確答案:A. 有直接在硬體上運作的類型,也有在一般作業系統上以應用程式形式運作的類型

虛擬機器監視器有直接在硬體上運作並管理作業系統的類型(類型1,裸機型,bare metal),以及在Windows或Linux等一般作業系統上以應用程式形式運作的類型(類型2,主機型,hosted)。類型1沒有多餘的層次,效能與隔離性較佳,因此多用於伺服器與雲端;類型2使用方便,常用於個人電腦上的開發與測試。兩者都會利用CPU的虛擬化支援功能等硬體。

關於容器(container)與虛擬機器的差異,下列何者正確?

  1. A容器各自擁有獨立的作業系統核心,虛擬機器則共用核心
  2. B容器在虛擬機器監視器上運作,虛擬機器則只靠作業系統的功能運作
  3. C容器共用核心,虛擬機器則執行各自獨立的作業系統
查看答案與解析

正確答案:C. 容器共用核心,虛擬機器則執行各自獨立的作業系統

容器是在共用同一個作業系統核心的情況下,依群組隔離檔案的呈現、行程、網路與可用資源等的方式。由於不必啟動整個作業系統,所以輕量,啟動也很快。虛擬機器則是在虛擬機器監視器上,各自執行包含獨立核心的作業系統,雖然較為沉重,但隔離性強,也能執行不同種類的作業系統。共用核心的是容器這一方,請注意說明顛倒的選項。

在實現 Linux 容器技術的核心功能中,命名空間(namespaces)與 cgroups(控制群組)的角色組合,下列何者正確?

  1. A命名空間:區隔行程看得到的東西(行程ID、網路、掛載等),cgroups:限制並計量CPU與記憶體等資源的使用量
  2. B命名空間:限制並計量CPU與記憶體等資源的使用量,cgroups:區隔行程看得到的東西(行程ID、網路、掛載等)
  3. C命名空間:為每個容器啟動另一個核心以互相隔離,cgroups:為每個容器建立虛擬的CPU並模擬硬體
查看答案與解析

正確答案:A. 命名空間:區隔行程看得到的東西(行程ID、網路、掛載等),cgroups:限制並計量CPU與記憶體等資源的使用量

容器是在主機核心上運作的一般行程,再以兩種機制加上隔離。命名空間把行程ID、網路、掛載(檔案系統的樣貌)、主機名稱等依群組區隔,讓容器內的行程只看得到自己的部分。cgroups 限制一群行程可使用的CPU時間與記憶體量,並計量其使用量。兩者都是核心的功能,因此容器既不會啟動另一個核心,也不會模擬硬體。

  1. 在 Linux 主機上使用 Docker,從以與主機不同的發行版為基礎的映像檔啟動容器,並在其中執行 uname -r(顯示核心版次的指令)與 cat /etc/os-release(顯示發行版資訊的指令)。關於結果的說明,下列何者正確?
  2. 關於容器映像檔與容器的關係,下列何者正確?
  3. 依不可變基礎設施的想法,更新正式環境伺服器軟體的方法,下列何者適當?

前往雲端與容器基礎的練習題

相關名詞的解說

容器技術
把應用程式與執行所需的函式庫和設定封裝在一起,在共用主機作業系統核心的同時,與其他行程隔離執行的技術;這樣執行的單位稱為容器。在 Linux 上以區隔行程ID、網路、掛載等樣貌的命名空間,以及限制CPU與記憶體使用量的 cgroups 實現。比啟動整個作業系統的虛擬機器輕巧、啟動也快,但因共用核心,無法執行與主機不同種類作業系統的核心。容器由容器映像檔建立,並以 Docker、Kubernetes 等工具建立與管理。
容器映像檔
建立容器所依據的唯讀範本。把應用程式的執行檔、函式庫、設定等檔案分層疊加,並附上要啟動的指令等設定,不包含作業系統的核心。由 Dockerfile 等建置,存放在登錄檔(registry)中發布。可用儲存庫名稱與標籤(例:web:1.4)指定,也可用由內容計算出的摘要(sha256:…)唯一指定。相同的層由多個映像檔共用。
虛擬機器監視器(Hypervisor)
在一台電腦上執行多個虛擬機器的軟體。將CPU、記憶體與裝置分配給各虛擬機器的作業系統,並使彼此隔離。也稱為虛擬機器監視器(VMM)。
Docker
用於建置容器映像檔、與登錄檔交換映像檔,以及啟動與管理容器的代表性軟體套件。由 Dockerfile 中撰寫的指令建置映像檔,以 docker run 啟動容器。可用 -p 公開連接埠、以磁碟區或繫結掛載保存資料,並進行網路設定。映像檔與容器的格式已以 OCI(Open Container Initiative)規格標準化,因此 Docker 以外的工具也能使用同樣的映像檔。
Kubernetes
在由許多機器(節點)組成的叢集上,配置容器、維持數量、進行更新並提供連線目標的編排平台。使用者以 Deployment、Service 等資源宣告「期望狀態」,控制器觀察實際狀態並使其接近宣告(調和)。最小單位是 Pod,Pod 消失時會自動重新建立,也支援滾動更新與依負載的自動擴展。也簡寫為 K8s。
不可變基礎設施
一旦建立的伺服器(虛擬機器或容器)就不再修改,需要更新時,從加入變更的映像檔建立新的伺服器來替換,並丟棄舊伺服器的營運想法。所有伺服器都由同一個映像檔建立,因此能防止手動作業的差異累積造成各伺服器的組成不一致,只要回到前一個映像檔就能輕易還原。日誌與資料等需要保留的東西,放在伺服器以外的儲存空間或資料庫中。

相關的比較