什么是LXC?
LXC(Linux 容器)是一种操作系统级虚拟化方法,它使用共享内核在单个主机上运行多个隔离的 Linux 系统。与完整虚拟机不同,LXC 容器共享主机操作系统内核,同时维护自己的文件系统、进程和网络堆栈。这种设计使它们极其轻便且启动速度快。
LXC 与虚拟机
LXC 容器和虚拟机之间的选择取决于您的隔离和性能要求:
| 特色 | LXC集装箱 | 虚拟机(KVM/QEMU) |
|---|---|---|
| 启动时间 | 毫秒到秒 | 秒到分钟 |
| 内存开销 | 最小(仅应用程序内存) | 每个来宾的完整操作系统内存 |
| 磁盘空间 | 100 MB–1 GB | 2–10+ GB |
| 内核 | 共享主机内核 | 独立内核 |
| 隔离 | 过程级 | 硬件级 |
| 最适合 | Web 服务器、微服务、开发环境 | 多租户、不同操作系统内核、完全隔离 |
下载模板
Proxmox 通过 pveam 提供预构建的容器模板。要列出来自 TurnKey Linux 和其他的可用模板:
pveam update
pveam available --section turnkeylinux
将模板下载到本地存储:
pveam download local ubuntu-22.04-standard_22.04-1_amd64.tar.zst
创建容器
从 CLI 或 Web UI 创建容器。基本参数包括主机名、密码、存储卷和网络配置:
pct create 100 local:vztmpl/ubuntu-22.04-standard_22.04-1_amd64.tar.zst \
--hostname web01 \
--password securePass123 \
--storage local-lvm \
--net0 name=eth0,bridge=vmbr0,ip=dhcp \
--unprivileged 1
pct start 100
密钥标志控制 root 密码、SSH 密钥、DNS 服务器和 CPU/内存分配。
非特权容器与特权容器
非特权容器通过 subuid 和 subgid 范围使用 UID/GID 映射运行,将容器内的根 (UID 0) 映射到主机上的高编号非特权 UID。这可以防止容器根目录具有主机根目录访问权限:
# Default mapping: container UID 0 maps to host UID 100000
# /etc/subuid contains: root:100000:65536
特权容器在主机上作为真正的 root 运行。它们提供更好的文件系统兼容性,但安全性较低。
关键权衡: 非特权容器无法挂载大多数文件系统(NFS、fuse、主机目录的绑定挂载),因为内核会阻止非特权挂载。如果您需要在容器内安装 NFS 或 FUSE,请使用特权容器并使用 AppArmor 限制访问。
资源限制
Proxmox 使用 cgroup 对容器实施资源限制:
| 资源 | 参数 | 示例 |
|---|---|---|
| CPU配额 | 占位符_0 | 50(一个核心的 50%) |
| CPU 核心 | 占位符_0 | 占位符_1 |
| 内存 | 占位符_0 | 2048 (MB) |
| 交换 | 占位符_0 | 512 (MB) |
| 磁盘 IOPS | 占位符_0 | 100 (MB/秒) |
在创建时或通过 pct set 设置限制:
pct set 100 --memory 2048 --swap 512 --cpulimit 50 --cores 2
绑定坐骑
绑定挂载与容器共享主机目录。对于非特权容器,您必须使用 map 选项正确映射 UID/GID:
pct set 100 --mp0 /mnt/storage/data,mp=/srv/data,acl=1
如果需要根挤压映射,请在 /etc/pve/lxc/100.conf 中添加挂载点条目:
mp0: /mnt/storage/data,mp=/srv/data,rootuid=1000,rootgid=1000
对于特权容器,绑定挂载无需 UID 重新映射即可工作,从而使共享存储变得更简单。
快照和克隆
快照以最小的空间开销 (COW) 捕获某个时间点的容器状态:
pct snapshot 100 pre-upgrade --description "Before PHP 8.3 upgrade"
列出和回滚快照:
pct listsnapshot 100
pct rollback 100 pre-upgrade
从模板或快照克隆容器以进行测试:
pct clone 100 101 --hostname staging-web
组网方式
容器支持三种网络模型:
- 桥接 (vmbr) — 容器显示为物理网络上的设备,通过 DHCP 获取自己的 MAC 和 IP。默认且最常见。
- 路由 — 容器使用主机后面的虚拟网络,并具有
iptables转发功能。当您控制上游路由时很有用。 - NAT — 容器在主机后面获取一个私有 IP,伪装到物理网络。简单但没有端口转发就没有入站访问。
备份与恢复
使用 vzdump 实现带有静默的一致容器备份:
vzdump 100 --mode suspend --compress zstd --storage backup-store
要从备份恢复容器:
pct restore 200 /var/lib/vz/dump/vzdump-lxc-100-2024_05_22-00_00_00.tar.zst \
--storage local-lvm
实际用例
- Web 服务器 — 轻量级 Nginx/Apache 容器,每个容器都是独立的。
- 数据库 — 容器中的 MySQL/PostgreSQL,绑定挂载到 ZFS 数据集以进行快照。
- Docker-in-LXC — 使用
nesting=1在特权容器中工作。由于 Docker 自己的隔离模型与 LXC cgroups 冲突,不建议用于生产。

