VM 與容器的差別在有沒有自己的 kernel

作業系統分成 Kernel(核心)Applications Layer(應用層)。VM 兩層都虛擬化,Docker 只虛擬化應用層——差別就是那一格「Guest OS Kernel」。

對照

VMContainer
虛擬化層級Kernel + 應用層(整個 OS)只有應用層
體積GB 級MB 級(Alpine 可到 5MB)
啟動數十秒~數分鐘0.1~2 秒
單機數量個位數~十幾個幾十~上百個
OS 相容性任何 OS 跑任何 OS受主機 kernel 限制
隔離強度強(安全邊界硬)中(共用 kernel,逃逸風險較高)

「共用硬體」不是關鍵——VM 也跑在同一台機器上。關鍵是容器沒有自己的 kernel,不用開機一套 OS

Mac / Windows 的例外

Docker Desktop 偷偷開了一台輕量 Linux VM,容器實際跑在那台 VM 的 Linux kernel 裡(Docker on VM on macOS)。所以:

  • Mac 上的 bind mount I/O 特別慢(要跨 VM 邊界)
  • Docker Desktop 固定吃掉幾 GB 記憶體

面試答法

VM 虛擬化硬體,每台上面跑一套完整 OS 含自己的 kernel,所以 GB 級、啟動數十秒;容器虛擬化作業系統,共用主機 kernel、只打包應用層檔案,所以 MB 級、啟動一兩秒。代價是隔離較弱、不能跑跟主機 kernel 不相容的系統。實務上兩者常一起用——雲端先開 VM,再在 VM 裡跑容器。

底層機制見 容器是被 namespace 與 cgroups 關起來的普通行程