LXC 容器:比 VM 輕量十倍的秘密武器

10 min read

如果說 VM 是幫每位房客蓋一棟獨立透天厝(有自己的地基、水管、電線),那 LXC 容器就是在同一棟大樓裡隔出不同住戶——共用結構和水電總管線,但每間房的鑰匙不同,你進不了隔壁的門。

省很多材料,蓋很快,而且對大多數住戶來說,住起來跟透天厝沒什麼差別。如果你還不熟 VM 的部分,可以先回去看 VM 管理完全指南

LXC vs VM:什麼時候用哪個?

KVM 虛擬機 LXC 容器
隔離等級 完整硬體虛擬化 作業系統級(共享核心)
效能損耗 5-10% 不到 1%
啟動時間 30-60 秒 1-3 秒
記憶體開銷 需要完整 OS 記憶體 只吃實際用量
支援 Windows 可以 不行
適合場景 需要完整 OS、跑 Windows、GPU 直通 Linux 服務、DNS、Web Server、反向代理

簡單的判斷法則

  • 需要跑 Windows -> VM
  • 需要不同的 Linux 核心版本 -> VM
  • 需要 GPU 直通 -> VM
  • 其他情況 -> 先考慮 LXC

Homelab 裡面跑的大部分服務——Pi-hole、Nginx Proxy Manager、WireGuard、AdGuard Home——用 LXC 就夠了,沒必要為了一個 DNS 服務開一整台 VM。那就像為了煮泡麵把整間餐廳的瓦斯爐都打開一樣浪費。

特權 vs 非特權容器

PVE 的 LXC 有兩種模式,這個很重要(詳細說明可參考 Proxmox LXC 官方文件):

非特權容器(Unprivileged)——預設,也是你應該用的

容器裡的 root(UID 0)在主機上其實是個路人甲(高位 UID)。就算容器被攻破,攻擊者在主機上的權限也約等於零。

特權容器(Privileged)——除非必要,否則別碰

容器內的 root 就是主機上的 root。跑 Docker-in-LXC 的時候可能需要,但安全風險比較高。

生產環境一律用非特權容器。需要特權模式的時候,先想想能不能用 VM 替代。

建立第一個 LXC 容器

方法一:Web 介面

  1. 先下載容器範本:左側 local 儲存 -> CT Templates -> Templates 按鈕 -> 選一個下載(推薦 Debian 12 或 Ubuntu 24.04)
  2. 右上角 Create CT
  3. 填 Hostname、Password
  4. 選範本
  5. 配置磁碟大小(8 GB 通常夠)、CPU(1 核)、記憶體(512 MB)
  6. 設定網路(DHCP 或固定 IP)
  7. 完成

方法二:CLI

# 先下載範本
pveam update
pveam available --section system | grep debian
pveam download local debian-12-standard_12.7-1_amd64.tar.zst
 
# 建立容器(ID 200、Debian 12、非特權、512MB RAM、8GB 磁碟)
pct create 200 local:vztmpl/debian-12-standard_12.7-1_amd64.tar.zst \
  --hostname my-container \
  --memory 512 \
  --cores 1 \
  --rootfs local-lvm:8 \
  --net0 name=eth0,bridge=vmbr0,ip=dhcp \
  --unprivileged 1 \
  --password
 
# 啟動
pct start 200
 
# 進入容器
pct enter 200

1-3 秒就開好了。跟 VM 比起來,這速度就像泡咖啡和泡即溶咖啡的差別。

OCI 映像支援(PVE 9.1+)

這是個大更新(PVE 9.1 Release Notes)。以前 LXC 只能用 Proxmox 自己的範本格式,現在你可以直接從 Docker Hub 拉映像來建容器:

# 從 Docker Hub 下載 nginx 映像
pveam download local docker://library/nginx:latest
 
# 從 GitHub Container Registry 下載
pveam download local docker://ghcr.io/some-org/some-image:latest

這意味著 Docker Hub 上成千上萬的映像都可以直接變成 LXC 容器來用,不需要先建 VM 再裝 Docker 再拉映像那套三層套娃。

Docker-in-LXC:Homelab 的熱門玩法

很多人的 Homelab 服務是用 Docker Compose 管理的。在 LXC 裡面跑 Docker 完全可行,設定也不複雜:

# 1. 在 PVE 主機上修改容器設定
# 開啟 nesting 和 keyctl(Docker 需要)
pct set 200 --features nesting=1,keyctl=1
 
# 如果非特權容器跑不動 Docker,可能需要改成特權:
# pct set 200 --unprivileged 0
# (但請先嘗試非特權 + nesting,大部分情況夠用)
 
# 2. 進入容器裝 Docker
pct enter 200
 
# 容器內執行:
apt update && apt install -y curl
curl -fsSL https://get.docker.com | sh
 
# 3. 測試
docker run hello-world

非特權容器 + nesting=1 在大部分情況下就能跑 Docker 了。只有少數需要存取特殊裝置的 Docker 容器才需要特權模式。先試非特權,不行再改。

Bind Mount:讓容器存取主機檔案

假設你的 PVE 主機上有一個 /mnt/data 目錄存放資料,你想讓容器也能讀寫:

# 在 PVE 主機上設定
pct set 200 --mp0 /mnt/data,mp=/data
 
# 重啟容器後,在容器內就能看到 /data 目錄
pct reboot 200

這在 NAS 場景特別好用——PVE 主機掛載的硬碟直接分享給多個容器使用,不用搞 NFS。更多儲存掛載方式請看儲存系統指南

非特權容器的 Bind Mount 有 UID 映射問題。容器內的 root 寫的檔案,在主機上會變成高位 UID。解法是在容器設定裡加 --mp0 /mnt/data,mp=/data,uid=0,gid=0,或者乾脆用特權容器。

資源配置與限制

LXC 的資源管理很靈活,可以邊跑邊改:

# 調整記憶體(不用重啟)
pct set 200 --memory 1024
 
# 調整 CPU 核心數
pct set 200 --cores 2
 
# 調整磁碟大小(只能加大,不能縮小)
pct resize 200 rootfs +5G
 
# 設定 CPU 使用率上限(百分比)
pct set 200 --cpulimit 1.5
 
# 網路頻寬限速(Mbps)
pct set 200 --net0 name=eth0,bridge=vmbr0,ip=dhcp,rate=100

Homelab 常見 LXC 服務一覽

服務 用途 建議資源
Pi-hole / AdGuard Home DNS 廣告過濾 1 核 / 256 MB / 2 GB
Nginx Proxy Manager 反向代理 + SSL 1 核 / 512 MB / 4 GB
WireGuard VPN 遠端存取 1 核 / 128 MB / 1 GB
Uptime Kuma 服務監控 1 核 / 256 MB / 2 GB
Gitea / Forgejo Git 服務 1 核 / 512 MB / 8 GB
Grafana 監控儀表板 1 核 / 512 MB / 4 GB

這些服務全部加起來的資源消耗,可能還不到一台 Windows VM 的一半。LXC 的強項就在這裡——用極少的資源跑極多的服務。

常用管理指令速查

pct list                    # 列出所有容器
pct start 200               # 啟動
pct stop 200                # 停止
pct enter 200               # 進入容器 shell
pct exec 200 -- apt update  # 在容器內執行指令
pct snapshot 200 snap1      # 拍快照
pct clone 200 201           # 克隆
pct destroy 200             # 刪除(需先停止)

LXC 還是 Docker?

這題常常被問到。答案是:不衝突,可以疊著用

一個合理的 Homelab 架構可能長這樣:

  • PVE 上面跑幾個 LXC 容器,每個容器跑一組相關的 Docker 服務
  • 簡單不需要 Docker 的服務(Pi-hole 等)直接用 LXC 原生跑
  • 需要完整 OS 或 Windows 的用 VM

不需要選邊站,把對的工具用在對的場景就好。

常見問題

Q: LXC 容器可以跑 Docker 嗎?

可以。在容器設定中啟用 nesting=1keyctl=1,然後在容器內正常安裝 Docker 即可。大部分情況下用非特權容器就能跑,只有極少數需要特殊裝置存取的才要切換成特權模式。

Q: LXC 容器的安全性夠嗎?會不會影響到主機?

非特權容器的安全性很高。容器內的 root 在主機上只是普通使用者,就算容器被攻破,攻擊者也無法取得主機權限。生產環境一律建議使用非特權容器。

Q: LXC 跟 Docker 有什麼不同?該用哪個?

LXC 更像一台輕量的虛擬機,有完整的 init 系統和 SSH;Docker 是應用層級的容器,專注單一服務。兩者不衝突,很多人在 LXC 裡面跑 Docker,結合兩者的優點。

Q: LXC 容器可以跑 Windows 嗎?

不行。LXC 是作業系統級虛擬化,共享 Linux 核心,所以只能跑 Linux 系統。需要跑 Windows 請使用 KVM 虛擬機

下一步

VM 和 LXC 都會了,接下來要搞懂它們的資料存在哪裡。下一篇聊 PVE 的儲存系統——ZFS、LVM、NFS 各有什麼差別: -> 儲存系統指南