VM 與容器的差別在有沒有自己的 kernel
作業系統分成 Kernel(核心) 與 Applications Layer(應用層)。VM 兩層都虛擬化,Docker 只虛擬化應用層——差別就是那一格「Guest OS Kernel」。
對照
| VM | Container | |
|---|---|---|
| 虛擬化層級 | 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 裡跑容器。