4 min read

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/initsystemd (多進程) Entrypoint 指定的指令 (單一進程)
可攜性 較低(依賴特定環境配置,不易跨機器遷移) 極高(Image 包含所有依賴,"Build once, run anywhere")
數據持久化 預設持久化(像 VM 虛擬硬碟) 預設由Image啟動是無狀態的(Image內部恆定,資料須掛載 volume)
生態系 較小 (Proxmox 是主要推手) 極大 (Docker Hub, K8s, Cloud Native)

3. 技術細節

  1. 可攜性與映像檔 (Portability & Images)

Docker: 最大的創新在於它的分層映像檔 (Layered Images) 機制。你可以將你的應用程式封裝成一個 Image,確保它在開發機、測試機和正式機上跑起來完全一樣。這是 Docker 統治市場的主因。

LXC: 通常是基於模板 (Template) 安裝一個 OS。要遷移 LXC 容器通常比較麻煩,類似於遷移一個 VM 的快照,不如 Docker 靈活。

  1. 狀態 (State)

LXC:有狀態 (Stateful) 的。你在 LXC 裡安裝了 PHP,重開機後 PHP 還在。你把 LXC 當作寵物 (Pet) 來養。

Docker: 理念上是無狀態 (Stateless) 的。如果你在運行的 Docker 容器內手動安裝了 PHP,一旦刪除容器重開,那個 PHP 就消失了。所有的變更都應該寫在 Dockerfile 裡重新構建 Image。你把 Docker 當作牲畜 (Cattle) 來對待。

  1. 關聯性 (Relationship)

有趣的是,Docker 在早期 (0.9版之前) 其實是基於 LXC 構建的。Docker 當時只是 LXC 的一個易用介面。但後來 Docker 開發了自己的執行環境 (libcontainer/runc),徹底脫離了對 LXC 工具集的依賴,以便更好地控制容器的生命週期和跨平台相容性。

4. 使用時機

使用 LXC 的時機:

  1. 替代傳統 VM: 你需要一台獨立的 Linux 伺服器來跑多個服務 (例如同時跑 Web, Database, Cron jobs),但不想承受 VM 的效能損耗。
  2. Proxmox VE 用戶: 如果你使用 Proxmox,LXC 是其原生的輕量級虛擬化方案,非常適合跑一些不需要 K8s 管理的內部服務(如 Pi-hole, VPN Server)。
  3. 需要完整的 Linux 功能: 需要 systemd、syslog 或 sshd 等系統級服務時。

使用 Docker 的時機:

  1. 微服務架構 (Microservices): 現代軟體開發的標準。
  2. CI/CD 與 DevOps: 需要快速部署、快速銷毀、環境一致性。
  3. 單一用途應用: 例如只要跑一個 MySQL 資料庫或一個 Nginx 伺服器。
  4. 需要使用 Kubernetes: K8s 是為了管理應用容器 (如 Docker/Containerd) 而生的。

總結:

  • LXC 是為了讓運維人員 (Ops) 能夠「更輕量地開虛擬機」
  • Docker 是為了讓開發人員 (Dev) 能夠「標準化地交付程式碼」。

現在的趨勢是:絕大多數的應用程式部署都使用 Docker;而 LXC 則在 Proxmox 等虛擬化平台上,作為傳統 VM 的高效能替代品繼續存在。