PVE(Proxmox VE)同时支持两种「虚拟化」:一种是基于 KVM 的虚拟机(QEMU/KVM),另一种就是 LXC(Linux Containers)容器。很多人第一次用 PVE 都会疑惑:既然已经有虚拟机了,为什么还要 LXC?它和 Docker 又是什么关系?本文简单梳理一下 LXC 的定位、与虚拟机和 Docker 的区别,以及它的优缺点。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
+------------------------------------------------------+
| 物理服务器 |
| CPU / Memory / Storage / NIC |
+---------------------------+--------------------------+
|
v
+------------------------------------------------------+
| Linux Host OS |
| Ubuntu / Debian / CentOS / Proxmox VE |
+------------------------------------------------------+
|
+-------------------+-------------------+
| |
v v

+-------------------------+ +-------------------------+
| LXC Container | | QEMU/KVM VM |
+-------------------------+ +-------------------------+
| Application | | Guest OS |
| Nginx / MySQL / Redis | | Ubuntu / Windows |
+-------------------------+ +-------------------------+
| Shared Host Kernel | | Virtual Hardware |
| (Namespace + Cgroups) | | CPU / RAM / Disk / NIC |
+-------------------------+ +-------------------------+
| Guest Kernel |
+-------------------------+
|
v
+-------------------------+
| QEMU Process |
+-------------------------+
|
v
+-------------------------+
| KVM Module |
| (Hardware Virtualization)|
+-------------------------+

LXC 是什么

LXC(Linux Containers)是 Linux 内核原生提供的操作系统级虚拟化技术,底层依赖两个内核特性:

  • Namespace(命名空间):隔离进程、网络、挂载点、主机名、用户等资源视图,让容器里看起来像一台独立的机器。
  • Cgroups(控制组):限制并统计 CPU、内存、磁盘 IO 等资源用量。

也就是说,LXC 容器没有自己的内核,它和宿主机共用同一个 Linux 内核,只是被”圈”在一个独立的运行环境里。所以 LXC 通常被称为「系统容器」(System Container),目标是跑一个完整的 Linux 用户态系统(有 init/systemd、有 sshd、有 cron),而不是只跑一个进程。

在 PVE 里,LXC 容器被称为 CT(Container),虚拟机称为 VM,两者在 Web UI 里并列显示,都能做备份、快照、迁移、HA。PVE 提供了 pct 命令行工具和现成的容器模板(Debian、Ubuntu、Alpine、Rocky 等)来管理它们。

LXC 与虚拟机(KVM)的区别

虚拟机是硬件级虚拟化:Hypervisor 模拟出一整套虚拟硬件(CPU、内存、磁盘、网卡、BIOS/UEFI),客户机安装自己的操作系统和内核。LXC 是操作系统级虚拟化:直接复用宿主机内核,只隔离用户态。(可以节省内存等硬件资源)

对比项 LXC 容器(CT) 虚拟机(KVM/VM)
隔离层级 内核 Namespace + Cgroups 硬件虚拟化(VT-x/AMD-V)
系统内核 与宿主机共用 独立内核
可运行操作系统 仅 Linux Linux / Windows / BSD 等
启动速度 秒级(甚至更快) 十几秒到几十秒
资源开销 极低,无额外内核与虚拟硬件开销 需为每台 VM 预留内存、模拟设备
内存占用 用多少占多少,可超分 通常按分配值占用(气球驱动可回收)
磁盘占用 模板几百 MB 起 系统镜像通常数 GB
隔离强度 较弱,共享内核即共享攻击面 强,攻击面局限在 Hypervisor
硬件直通 受限(设备节点映射、GPU 需特殊配置) 完整支持 PCIe 直通
自定义内核/模块 不支持(加载模块需在宿主机) 支持
迁移 无法在线迁移 支持在线迁移
高可用 支持 支持

一句话总结:同样一台宿主机,能跑 10 台虚拟机的资源,往往可以跑 50 个以上 LXC 容器。 代价是隔离性下降、只能跑 Linux、不能玩内核层面的东西。

LXC 与 Docker 的区别

Docker(以及 containerd、Podman)用的其实是同一套内核技术,但设计哲学完全不同:

  • LXC 是系统容器,Docker 是应用容器。 LXC 里跑的是完整的发行版,开机跑 systemd,你 SSH 进去和登录一台小服务器没什么差别;Docker 容器通常只有一个前台进程,容器的生命周期就是这个进程的生命周期。
  • 持久化思路不同。 LXC 是”宠物”,你 apt install、改配置、留数据,长期养着,配合快照回滚;Docker 是”牲畜”,镜像不可变,配置靠环境变量和挂载卷,容器随时删掉重建。
  • 交付方式不同。 Docker 有分层镜像、Dockerfile、Registry 这一整套生态,可以把应用及依赖打包分发;LXC 只有 rootfs 模板,更接近”一个精简的系统安装包”。
  • 管理界面不同。 在 PVE 里,LXC 是一等公民:有 Web UI、备份任务、快照、防火墙、资源池、HA,与 VM 完全一致;Docker 在 PVE 中并没有原生管理界面(官方也不建议直接装在宿主机上)。

因此两者并不冲突,常见做法是:在 PVE 上开一台 VM(或一个 LXC)作为 Docker 宿主,用 LXC 跑那些”像服务器一样”的服务,用 Docker 跑那些”像应用一样”的服务。

注意:在 LXC 里再跑 Docker 是可行的,但需要非特权容器额外开启 keyctl、nesting 等选项,存储驱动也有限制(通常要用 fuse-overlayfs 或 vfs),生产环境更推荐放到 VM 里。

优势

  1. 资源开销极低:没有额外内核、没有虚拟硬件模拟,内存和 CPU 几乎全部给到业务本身,适合小主机、NAS、软路由这类资源有限的场景。
  2. 启动快:秒级启停,重建成本很低。
  3. 内存/存储可超分:容器内存按实际使用占用,磁盘用 ZFS/LVM-Thin 时可以精简置备,同样硬件能跑更多实例。
  4. 直接访问宿主机资源更容易:通过 bind mount 把宿主机目录挂进容器,共享大容量存储非常方便,不需要走网络文件系统。
  5. 管理体验统一:PVE 里备份(vzdump)、快照、克隆、模板、防火墙、HA 都和虚拟机一样操作,学习成本低。
  6. 模板开箱即用:官方模板库一键下载 Debian/Ubuntu/Alpine/Rocky 等,几十秒就能开出一台”新机器”。

缺点与限制

  1. 隔离性弱于虚拟机:共享内核意味着内核漏洞可能导致越权逃逸。多租户、不可信负载请用 VM。
  2. 只能跑 Linux:Windows、BSD 一律无解。
  3. 内核不可控:不能加载自定义内核模块,不能改内核参数(部分 sysctl 在非特权容器里不可写),像 ZFS、WireGuard 模块、iptables 某些功能都要在宿主机侧准备好。
  4. 对特殊硬件不友好:PCIe 直通做不到;GPU、TUN/TAP、USB 设备需要手动映射设备节点并处理权限,非特权容器下更麻烦。
  5. 在线迁移受限:LXC 目前主要靠关机后迁移,不像 KVM 那样成熟地热迁移。也就是不支持不停机维护。
  6. 权限模型有学习门槛:特权容器(privileged)方便但风险高;非特权容器(unprivileged,默认且推荐)安全,但 UID 映射会带来挂载目录权限、NFS/CIFS 挂载、Docker 嵌套等一系列坑。
  7. 部分软件官方不支持容器部署:某些应用假设自己独占系统或需要特定内核特性,在 LXC 中可能出现难以排查的问题。

什么时候选谁

  • 选 LXC:轻量服务(Nginx、反向代理、DNS、数据库、Zabbix Agent、Samba/NFS 共享、监控探针、跳板机、小工具脚本),需要长期维护、资源敏感、只跑 Linux 的场景。
  • 选 VM:Windows、需要独立内核或内核模块、需要硬件直通(显卡转码、直通网卡的 OPNsense/OpenWrt)、不可信负载、需要强隔离与在线迁移的场景。
  • 选 Docker:无状态应用、需要快速升级回滚、上游只提供镜像的开源项目、多实例编排;建议跑在专门的 VM 里。

PVE CT管理常用命令

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
## 列出容器
pct list

## 创建容器(示例:非特权、Debian 12 模板)
pct create 101 local:vztmpl/debian-12-standard_12.7-1_amd64.tar.zst \
--hostname test-ct --cores 2 --memory 2048 --swap 512 \
--rootfs local-lvm:8 --net0 name=eth0,bridge=vmbr0,ip=dhcp \
--unprivileged 1 --features nesting=1

##启停与进入
pct start 101
pct stop 101
pct enter 101 # 直接进入 shell
pct exec 101 -- ip a # 在容器内执行命令

## 快照与备份
pct snapshot 101 before-upgrade
pct rollback 101 before-upgrade
vzdump 101 --storage local --mode snapshot

## 配置查看与修改
pct config 101
pct set 101 --memory 4096
pct set 101 --mp0 /mnt/data,mp=/data # 挂载宿主机目录

容器配置文件位于 /etc/pve/lxc/<VMID>.conf,模板存放在 /var/lib/vz/template/cache/,可通过 Web UI 的 local → CT Templates → Templates 直接下载。

  • 在WebUI可以右键节点然后选择创建CT。

从dockerhub拉取镜像

PVE已支持OCI容器镜像标准,可以从dockerhub直接拉取镜像。

运维技术交流群

发送邮件到 ➡️ [email protected]

或者关注WX公众号:网工格物

微信扫码

博客(最先更新)

https://songxwn.com/