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