LXC 容器:比 VM 輕量十倍的秘密武器
如果說 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 介面
- 先下載容器範本:左側
local儲存 ->CT Templates->Templates按鈕 -> 選一個下載(推薦 Debian 12 或 Ubuntu 24.04) - 右上角
Create CT - 填 Hostname、Password
- 選範本
- 配置磁碟大小(8 GB 通常夠)、CPU(1 核)、記憶體(512 MB)
- 設定網路(DHCP 或固定 IP)
- 完成
方法二: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 2001-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=100Homelab 常見 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=1 和 keyctl=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 各有什麼差別: -> 儲存系統指南