虛擬化與容器

容器與虛擬機(containers vs virtual machines)

這是執行隔離工作負載的兩大方式,而最尖銳的單一區別是:它們共不共用一個核心?一台虛擬機帶著「自己」完整的作業系統核心,跑在超管理器提供的虛擬硬體上——是一整台用軟體做出來的、獨立的電腦。一個容器則共用「主機」那唯一的核心,它不過是一組被核心用命名空間與 cgroups 圍起來的行程,使它們看起來、感覺起來像是擁有自己的機器。虛擬機=虛擬硬體上的獨立核心;容器=共享核心上被隔離的行程。

光這一個差別就連鎖地影響到一切。一台虛擬機必須啟動一個核心與一套作業系統,所以它以「秒」為單位啟動、重達數百 MiB 到數 GiB、並跑著自己那份 OS 副本——重量級但自給自足。一個容器沒有核心要啟動;它只是啟動行程,所以它以「毫秒」為單位啟動、可以只有幾 MiB、並能在一台主機上塞得密集得多。另一面是它們防的是什麼:一台虛擬機的客體只跟虛擬硬體與底下那層薄薄的超管理器對話,所以一個客體核心漏洞還得逃出超管理器才能碰到其他客體。一個容器的行程則全都直接呼叫進那唯一的共享主機核心,所以一個從容器內部可觸及的核心漏洞,原則上能危及主機與其上每一個其他容器。

所以真正的取捨是「隔離強度對上效率」,而這是一個貨真價實的工程選擇,沒有絕對的贏家。容器給你速度、密度,以及一個你能即刻運送、即刻啟動的小巧映像——非常適合打包與擴展應用程式。虛擬機給你更強的安全與故障邊界,以及跑一個完全不同 OS 的自由——非常適合嚴格的多租戶隔離。關於安全那一塊要誠實:在安全意義上,容器「不是」「輕量虛擬機」;它們共享核心的攻擊面大得多。正是這道缺口,使得業界打造了趨同的中間地帶——microVM 與使用者空間核心沙箱——好用「容器般的速度」換到「虛擬機般的隔離」。

在一台主機上,你跑五台虛擬機(各自啟動自己的 Linux 核心、約 1 GiB 記憶體、要幾秒啟動)與五百個容器(共用主機核心、各數十 MiB、毫秒級啟動)。容器塞得更密;虛擬機隔離得更硬。

虛擬機各自啟動一個核心、硬隔離;容器共用核心、密集打包。

在安全意義上,容器不是「輕量虛擬機」:虛擬機有獨立核心與一層薄薄的超管理器邊界,而所有容器共用那唯一的主機核心,攻擊面大得多。要誠實看待「速度對隔離」這個選擇。

又稱
OS-level virtualization vs machine virtualizationshared-kernel vs separate-kernel容器與虛擬機之別