LXC vs Docker
LXC (Linux Containers) 和 Docker 都是基於 Linux 內核的容器化技術(都利用 Namespaces 和 Cgroups 來隔離資源),但它們的設計理念和使用場景有著根本的區別。簡單來說:
- LXC 像是「輕量級的虛擬機 (System Container)」。
- Docker 像是「被打包的應用程式 (Application Container)」。
1. 核心理念 (The Core Philosophy)
這是兩者最大的分水嶺,決定了它們如何被使用。
- LXC (以作業系統為中心):
- 目標: 提供一個完整的 Linux 系統環境,但比傳統 VM (如 VMware, VirtualBox) 更輕量。
- 運作方式: 啟動 LXC 容器時,它會像開機一樣啟動 /sbin/init (或 systemd),然後啟動 cron、syslog、ssh 等背景服務。
- 使用體驗: 使用起來就像登入了一台遠端伺服器 (VPS)。你會 SSH 進去,安裝軟體,修改配置檔。
- Docker (以應用程式為中心):
- 目標: 打包和執行「單一應用程式」及其依賴環境。
- 運作方式: Docker 容器啟動時,通常只跑一個主進程 (例如 nginx 或 python app.py)。沒有 init 進程,沒有後台服務。一旦該主進程結束,容器就會停止。
- 使用體驗: 它更像是一個「可執行的二進位檔案」,一跑起來就是服務本身,而不是一個完整的作業系統。
2. 主要差異對照表
| 特性 | LXC (Linux container) | Docker |
|---|---|---|
| 類型 | 系統容器 (System container) | 應用容器 (Application container) |
| 內容物 | 完整的 OS 用戶空間 (含 init, ssh, cron 等) | 僅包含應用程式+必要依賴庫 |
| 管理方式 | 偏向 VM 模式 (Ansible, ssh, bash指令) | Docker cli, Dockerfile, Kubernetes |
| 啟動進程 | /sbin/init 或 systemd (多進程) |
Entrypoint 指定的指令 (單一進程) |
| 可攜性 | 較低(依賴特定環境配置,不易跨機器遷移) | 極高(Image 包含所有依賴,"Build once, run anywhere") |
| 數據持久化 | 預設持久化(像 VM 虛擬硬碟) | 預設由Image啟動是無狀態的(Image內部恆定,資料須掛載 volume) |
| 生態系 | 較小 (Proxmox 是主要推手) | 極大 (Docker Hub, K8s, Cloud Native) |
3. 技術細節
- 可攜性與映像檔 (Portability & Images)
• Docker: 最大的創新在於它的分層映像檔 (Layered Images) 機制。你可以將你的應用程式封裝成一個 Image,確保它在開發機、測試機和正式機上跑起來完全一樣。這是 Docker 統治市場的主因。
• LXC: 通常是基於模板 (Template) 安裝一個 OS。要遷移 LXC 容器通常比較麻煩,類似於遷移一個 VM 的快照,不如 Docker 靈活。
- 狀態 (State)
• LXC: 是有狀態 (Stateful) 的。你在 LXC 裡安裝了 PHP,重開機後 PHP 還在。你把 LXC 當作寵物 (Pet) 來養。
• Docker: 理念上是無狀態 (Stateless) 的。如果你在運行的 Docker 容器內手動安裝了 PHP,一旦刪除容器重開,那個 PHP 就消失了。所有的變更都應該寫在 Dockerfile 裡重新構建 Image。你把 Docker 當作牲畜 (Cattle) 來對待。
- 關聯性 (Relationship)
有趣的是,Docker 在早期 (0.9版之前) 其實是基於 LXC 構建的。Docker 當時只是 LXC 的一個易用介面。但後來 Docker 開發了自己的執行環境 (libcontainer/runc),徹底脫離了對 LXC 工具集的依賴,以便更好地控制容器的生命週期和跨平台相容性。
4. 使用時機
使用 LXC 的時機:
- 替代傳統 VM: 你需要一台獨立的 Linux 伺服器來跑多個服務 (例如同時跑 Web, Database, Cron jobs),但不想承受 VM 的效能損耗。
- Proxmox VE 用戶: 如果你使用 Proxmox,LXC 是其原生的輕量級虛擬化方案,非常適合跑一些不需要 K8s 管理的內部服務(如 Pi-hole, VPN Server)。
- 需要完整的 Linux 功能: 需要 systemd、syslog 或 sshd 等系統級服務時。
使用 Docker 的時機:
- 微服務架構 (Microservices): 現代軟體開發的標準。
- CI/CD 與 DevOps: 需要快速部署、快速銷毀、環境一致性。
- 單一用途應用: 例如只要跑一個 MySQL 資料庫或一個 Nginx 伺服器。
- 需要使用 Kubernetes: K8s 是為了管理應用容器 (如 Docker/Containerd) 而生的。
總結:
- LXC 是為了讓運維人員 (Ops) 能夠「更輕量地開虛擬機」
- Docker 是為了讓開發人員 (Dev) 能夠「標準化地交付程式碼」。
現在的趨勢是:絕大多數的應用程式部署都使用 Docker;而 LXC 則在 Proxmox 等虛擬化平台上,作為傳統 VM 的高效能替代品繼續存在。
Member discussion