虛擬化技術介紹
虛擬化技術介紹(VM vs Container)
TL;DR虛擬化要解決的核心問題:「我寫的程式在我的電腦能跑,搬你電腦就爆掉」。兩大技術:Virtual Machine(系統層,模擬整個 OS,啟動慢但隔離強)、Container(OS 層,共用 host kernel,啟動快但隔離較弱)。Container 是現代主流,Docker 是事實標準。
主要參考Docker 基礎教學與介紹 101 — cwhu
為什麼需要虛擬化
環境一致性問題:
我的電腦 你的電腦
- macOS 14.0 - Windows 11
- Node 20.x - Node 18.x
- Python 3.12 - Python 3.10
- libssl 3.0 - libssl 1.1
- ... - ...
我的程式可以跑 你的電腦會炸 ❌
虛擬化的目標:把「執行環境」打包成 獨立、可移動、跨硬體相同行為 的單元。
兩種主流方法:
- Virtual Machine(虛擬機器):模擬 整個作業系統
- Container(容器):共用 host OS,只 隔離應用層
Virtual Machine(VM)— 以作業系統為中心
工作原理
┌────────────────────────────────────────┐
│ Application │
├────────────────────────────────────────┤
│ Bins / Libs │
├────────────────────────────────────────┤
│ Guest OS │ ← 完整另一個 OS
├────────────────────────────────────────┤
│ Hypervisor (VirtualBox / │ ← 虛擬化層
│ VMware / KVM / Hyper-V) │
├────────────────────────────────────────┤
│ Host OS │
├────────────────────────────────────────┤
│ Hardware │
└────────────────────────────────────────┘
Hypervisor(管理程式):
- 在 Host OS 上 模擬硬體,讓 Guest OS 以為自己跑在獨立電腦上
- 多個 VM 可以同時跑,互不打架
代表:VirtualBox / VMware / KVM / Hyper-V
優缺點
| ✅ 優點 | ❌ 缺點 |
|---|---|
| 完全隔離(各 VM 獨立 OS) | 啟動慢(秒-分鐘級) |
| 可跑 不同 OS(Linux on Mac / Windows on Linux) | 吃資源(每個 VM 都要 GB 級記憶體) |
| 安全性最高 | 硬碟空間大(整個 OS 副本) |
| Hardware abstraction | 啟動 / 部署複雜 |
Container — 以應用程式為中心
工作原理
┌────────────────────────────────────────┐
│ Container 1 Container 2 Container 3│
│ App + Libs App + Libs App + Libs │ ← 各自獨立
├────────────────────────────────────────┤
│ Container Manager (Docker / containerd)│ ← 隔離管理
├────────────────────────────────────────┤
│ Host OS Kernel │ ← ⭐ 共用!
├────────────────────────────────────────┤
│ Hardware │
└────────────────────────────────────────┘
關鍵差異:Container 共用 Host OS Kernel,不需要裝 Guest OS。
隔離機制:
- Namespace(隔離 process / network / mount / user)
- Cgroups(限制 CPU / memory / disk I/O)
代表:Docker / Podman / containerd
優缺點
| ✅ 優點 | ❌ 缺點 |
|---|---|
| 啟動超快(秒級,通常 <1s) | 共用 kernel,一個破壞影響全部 |
| 省資源(MB 級記憶體) | 隔離性比 VM 弱 |
| 小硬碟空間(沒 Guest OS) | 主要支援 Linux containers(Windows 較複雜) |
| 部署簡單(Docker image) | 安全 boundary 比 VM 弱 |
VM vs Container 完整對比
| 維度 | Virtual Machine | Container |
|---|---|---|
| 抽象層次 | 系統層(OS 級) | 應用層 |
| 啟動速度 | 秒-分鐘 | 毫秒-秒 |
| 資源占用 | GB 級 | MB 級 |
| 硬碟空間 | 數 GB(含整個 OS) | 數十 MB(只 app + libs) |
| Guest OS | 需要 | 不需要(共用 host) |
| 隔離強度 | ⭐⭐⭐⭐⭐ 強 | ⭐⭐⭐ |
| 密度(同主機可跑幾個) | 低(10-30) | 高(100+) |
| 用途 | 跑不同 OS / 強隔離 | Microservices / CI/CD |
| 代表 | VirtualBox / VMware | Docker / Kubernetes |
實務上常常混合用
雲服務(AWS / GCP / Azure)的真實架構:
Host Hardware
└─ Hypervisor (KVM / Xen)
├─ VM 1
│ ├─ Container 1 (app A)
│ ├─ Container 2 (app B)
│ └─ Container 3 (app C)
├─ VM 2
│ ├─ Container 4
│ └─ Container 5
└─ ...
為什麼這樣:
- VM 提供 租戶間隔離(不同公司的資料絕對不互相影響)
- Container 提供 應用間靈活打包
Cloud serverless 也是這個原理:Lambda / Cloud Run 底層是 micro VM(Firecracker)+ container。
Docker 基礎(Container 主流)
核心概念
| 概念 | 比喻 |
|---|---|
| Dockerfile | 食譜(怎麼做) |
| Image | 半成品冷凍食品(可分享、可堆疊) |
| Container | 成品熱食(image 跑起來的實例) |
| Volume | 外接硬碟(持久化資料) |
| Network | 容器間怎麼通訊 |
最簡單的 Dockerfile
FROM node:20-alpine # 基底 image
WORKDIR /app # 工作目錄
COPY package*.json ./
RUN npm ci # 安裝依賴
COPY . .
RUN npm run build
EXPOSE 3000 # 對外 port
CMD ["npm", "start"] # 啟動命令
docker build -t my-app .
docker run -p 3000:3000 my-app
docker-compose(多 container 編排)
# docker-compose.yml
services:
web:
build: .
ports: ["3000:3000"]
depends_on: [db]
environment:
DATABASE_URL: postgresql://user:pass@db:5432/mydb
db:
image: postgres:16
volumes: ["pgdata:/var/lib/postgresql/data"]
environment:
POSTGRES_USER: user
POSTGRES_PASSWORD: pass
POSTGRES_DB: mydb
volumes:
pgdata:
docker-compose up # 啟動全部
docker-compose down -v # 停止 + 清 volume
2026 年 Container 生態
| 工具 | 用途 |
|---|---|
| Docker | 事實標準,個人 / 開發 |
| Podman | Docker 替代,daemonless |
| containerd / runc | 底層 runtime |
| Kubernetes (K8s) | 生產級編排(多機 cluster) |
| Docker Compose | 單機多 container |
| Buildah | 純 build image,no daemon |
| Skaffold | K8s dev 流程 |
何時用 Container vs VM
用 Container
- Microservice 架構
- CI/CD pipeline(快速 spawn / destroy)
- dev/staging/prod 環境一致
- Serverless 後端(底層多半是 container)
用 VM
- 跑非 Linux OS(Windows on Mac)
- 強安全 / 強隔離 需求(銀行 / 政府)
- 老 legacy 系統,只能 OS-level 包
- Kernel-level 操作(driver 開發 / OS 學習)
進一步學習路徑
1. 看完本篇(VM vs Container 概念)✅
2. 上手 Docker(寫 Dockerfile + docker run)
3. docker-compose(多服務)
4. CI/CD 整合(GitHub Actions build image)
5. Kubernetes 基礎(Pod / Deployment / Service)
6. 雲端 K8s(EKS / GKE / AKS)
7. Helm / Kustomize(部署模板化)
8. Service Mesh(Istio / Linkerd)— 進階
個人推薦資源
- Docker Curriculum — 從 0 到能用
- Kubernetes the Hard Way — 深入了解 K8s 原理
- Play with Docker — 線上 sandbox