Proxmox VE LXC - 系统级容器
PVE(Proxmox VE)同时支持两种「虚拟化」:一种是基于 KVM 的虚拟机(QEMU/KVM),另一种就是 LXC(Linux Containers)容器。很多人第一次用 PVE 都会疑惑:既然已经有虚拟机了,为什么还要 LXC?它和 Docker 又是什么关系?本文简单梳理一下 LXC 的定位、与虚拟机和 Docker 的区别,以及它的优缺点。
1 | +------------------------------------------------------+ |
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 里。
优势
- 资源开销极低:没有额外内核、没有虚拟硬件模拟,内存和 CPU 几乎全部给到业务本身,适合小主机、NAS、软路由这类资源有限的场景。
- 启动快:秒级启停,重建成本很低。
- 内存/存储可超分:容器内存按实际使用占用,磁盘用 ZFS/LVM-Thin 时可以精简置备,同样硬件能跑更多实例。
- 直接访问宿主机资源更容易:通过 bind mount 把宿主机目录挂进容器,共享大容量存储非常方便,不需要走网络文件系统。
- 管理体验统一:PVE 里备份(vzdump)、快照、克隆、模板、防火墙、HA 都和虚拟机一样操作,学习成本低。
- 模板开箱即用:官方模板库一键下载 Debian/Ubuntu/Alpine/Rocky 等,几十秒就能开出一台”新机器”。
缺点与限制
- 隔离性弱于虚拟机:共享内核意味着内核漏洞可能导致越权逃逸。多租户、不可信负载请用 VM。
- 只能跑 Linux:Windows、BSD 一律无解。
- 内核不可控:不能加载自定义内核模块,不能改内核参数(部分 sysctl 在非特权容器里不可写),像 ZFS、WireGuard 模块、iptables 某些功能都要在宿主机侧准备好。
- 对特殊硬件不友好:PCIe 直通做不到;GPU、TUN/TAP、USB 设备需要手动映射设备节点并处理权限,非特权容器下更麻烦。
- 在线迁移受限:LXC 目前主要靠关机后迁移,不像 KVM 那样成熟地热迁移。也就是不支持不停机维护。
- 权限模型有学习门槛:特权容器(privileged)方便但风险高;非特权容器(unprivileged,默认且推荐)安全,但 UID 映射会带来挂载目录权限、NFS/CIFS 挂载、Docker 嵌套等一系列坑。
- 部分软件官方不支持容器部署:某些应用假设自己独占系统或需要特定内核特性,在 LXC 中可能出现难以排查的问题。
什么时候选谁
- 选 LXC:轻量服务(Nginx、反向代理、DNS、数据库、Zabbix Agent、Samba/NFS 共享、监控探针、跳板机、小工具脚本),需要长期维护、资源敏感、只跑 Linux 的场景。
- 选 VM:Windows、需要独立内核或内核模块、需要硬件直通(显卡转码、直通网卡的 OPNsense/OpenWrt)、不可信负载、需要强隔离与在线迁移的场景。
- 选 Docker:无状态应用、需要快速升级回滚、上游只提供镜像的开源项目、多实例编排;建议跑在专门的 VM 里。
PVE CT管理常用命令
1 | ## 列出容器 |
容器配置文件位于 /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公众号:网工格物
