pct 是 Proxmox VE (PVE) 中用于管理 LXC 容器 (Linux Containers) 的核心命令行工具。与 qm 管理虚拟机不同,pct 专注于轻量级、基于内核的容器管理,具有启动快、资源占用少、效率高的特点。
一、基本语法
1
| pct <command> <ctid> [options]
|
<command>: 操作命令(如 create, start, set, exec 等)。<ctid>: 容器的唯一数字 ID(如 100, 101)。[options]: 命令参数或配置选项。
📌 容器 ID 范围建议:通常使用 100~999,避免与系统保留 ID 冲突。
二、常用命令分类详解
1. 生命周期管理(启动/停止/重启/挂起)
| 命令 | 说明 | 示例 |
|---|
pct start <ctid> | 启动容器 | pct start 100 |
pct stop <ctid> | 优雅停止容器(发送 SIGTERM,等待进程退出) | pct stop 100 |
pct shutdown <ctid> | 同 stop,推荐使用 | pct shutdown 100 |
pct restart <ctid> | 重启容器 | pct restart 100 |
pct reset <ctid> | 强制重启(不等待进程退出) | pct reset 100 |
pct suspend <ctid> | 挂起容器(保存状态到内存) | pct suspend 100 |
pct resume <ctid> | 恢复挂起的容器 | pct resume 100 |
pct destroy <ctid> | 永久删除容器及其数据! | pct destroy 100 |
⚠️ 警告:destroy 是不可逆操作,请务必确认!
2. 创建容器 (pct create)
这是最核心也是参数最多的命令。
基本结构:
1
| pct create <ctid> <模板文件路径> [OPTIONS]
|
完整示例:
1
2
3
4
5
6
7
8
9
10
11
| pct create 100 /var/lib/vz/template/cache/ubuntu-22.04-standard_22.04-1_amd64.tar.zst \
--hostname web-ct01 \
--rootfs local-lvm:8 \
--memory 512 \
--swap 512 \
--cores 1 \
--net0 name=eth0,bridge=vmbr0,ip=dhcp,firewall=1 \
--unprivileged 1 \
--features keyctl=1,nesting=1 \
--password MySecurePass123! \
--description "Web Server Container"
|
关键参数详解:
| 参数 | 说明 | 示例值 |
|---|
--hostname | 容器主机名 | web-server |
--rootfs <存储>:<大小>[,选项] | 根文件系统配置 | local-lvm:8 或 local:8,format=subvol |
--memory | 内存限制 (MB) | 512 |
--swap | 交换空间大小 (MB) | 512 |
--cores | CPU 核心数 | 1 |
--cpuunits | CPU 权重(默认1024,值越大优先级越高) | 1024 |
--net<n> | 网络配置 | name=eth0,bridge=vmbr0,ip=dhcp,gw=192.168.1.1 |
--unprivileged 1 | 创建非特权容器(强烈推荐,更安全) | 1 (是) / 0 (否) |
--privileged 1 | 创建特权容器(危险,仅特殊需求使用) | 1 |
--features | 启用高级功能 | keyctl=1,nesting=1,mount=1 |
--password | 设置 root 用户密码 | MyPass123 |
--ssh-public-keys | 注入 SSH 公钥文件路径 | --ssh-public-keys /root/.ssh/id_rsa.pub |
--onboot 1 | 开机自启 | 1 (启用) / 0 (禁用) |
--description | 描述信息 | "Database Container" |
--ostype | 操作系统类型(通常自动识别) | ubuntu, debian, centos |
💡 网络配置 (--net0) 详解:
name=eth0: 容器内网卡名。bridge=vmbr0: 连接到的 Proxmox 网桥。ip=dhcp 或 ip=192.168.1.100/24: 静态 IP。gw=192.168.1.1: 网关。firewall=1: 启用容器防火墙。
💡 --features 常用选项:
nesting=1: 允许在容器内运行 Docker 或 systemd-nspawn(需特权或特定配置)。keyctl=1: 允许使用内核密钥环(某些应用需要)。mount=1: 允许挂载文件系统(特权容器才有效)。
3. 配置管理 (pct set, pct config)
修改容器配置 (pct set)
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
| # 修改内存为 1024MB
pct set 100 --memory 1024
# 增加 CPU 核心到 2
pct set 100 --cores 2
# 修改主机名
pct set 100 --hostname db-ct01
# 添加第二个网卡
pct set 100 --net1 name=eth1,bridge=vmbr1,ip=dhcp
# 启用开机自启
pct set 100 --onboot 1
# 修改 root 密码
pct set 100 --password NewPassword456!
# 删除某个配置项(如第二个网卡)
pct set 100 --delete net1
# 启用特权模式(不推荐)
pct set 100 --privileged 1
# 添加功能
pct set 100 --features nesting=1,keyctl=1
|
查看容器配置 (pct config)
示例输出:
1
2
3
4
5
6
7
8
9
10
11
12
13
| arch: amd64
cores: 1
description: Web Server Container
features: keyctl=1,nesting=1
hostname: web-ct01
memory: 512
net0: name=eth0,bridge=vmbr0,firewall=1,ip=dhcp
onboot: 1
ostype: ubuntu
password: ...
rootfs: local-lvm:subvol-100-disk-0,size=8G
swap: 512
unprivileged: 1
|
4. 状态与信息查看
| 命令 | 说明 | 示例 |
|---|
pct list | 列出所有容器及其状态 | pct list |
pct status <ctid> | 查看指定容器状态 | pct status 100 |
pct ps <ctid> | 查看容器内运行的进程 | pct ps 100 |
pct df <ctid> | 查看容器内磁盘使用情况 | pct df 100 |
pct exec <ctid> <命令> | 在容器内执行命令 | pct exec 100 -- df -h |
pct list 输出示例:
1
2
3
| VMID Status Lock Name
100 running web-ct01
101 stopped db-ct01
|
5. 快照管理 (pct snapshot, pct rollback, pct delsnapshot)
创建快照
1
| pct snapshot <ctid> <snapshot-name> [OPTIONS]
|
示例:
1
2
3
4
5
| # 创建快照
pct snapshot 100 pre-update --description "Before apt upgrade"
# 创建快照并停止容器(确保一致性)
pct snapshot 100 pre-update --stop 1
|
查看快照
1
| pct listsnapshot <ctid>
|
回滚快照
1
| pct rollback <ctid> <snapshot-name>
|
示例:
1
| pct rollback 100 pre-update
|
删除快照
1
| pct delsnapshot <ctid> <snapshot-name>
|
示例:
1
| pct delsnapshot 100 pre-update
|
📌 注意:容器快照是文件系统级别的快照,依赖于底层存储(如 ZFS、LVM thin、目录存储的 bind mount + rsync)。不同存储后端性能和功能有差异。
6. 备份与恢复 (pct backup, pct restore)
⚠️ 重要:pct backup 命令在较新版本 PVE 中已被弃用,推荐使用 vzdump。
使用 vzdump 备份容器
1
2
3
4
5
| # 备份 CT 100
vzdump 100 --storage backup-storage --compress zstd
# 带描述和停止容器以确保一致性
vzdump 100 --storage backup --stop 1 --notes "Daily backup"
|
恢复备份 (pct restore)
1
2
3
4
5
| # 从备份文件恢复到新 CT ID (102)
pct restore 102 /var/lib/vz/dump/vzdump-lxc-100-2025_09_15-12_00_00.tar.zst --storage local-lvm
# 覆盖现有容器 (谨慎!)
pct restore 100 /path/to/backup.tar.zst --force
|
7. 文件操作 (pct push, pct pull, pct file) (Proxmox 7.3+)
🆕 新功能:PVE 7.3+ 引入了更方便的文件传输命令。
从主机复制文件到容器
1
| pct push <ctid> <本地文件路径> <容器内路径>
|
示例:
1
| pct push 100 /root/config.yaml /etc/myapp/config.yaml
|
从容器复制文件到主机
1
| pct pull <ctid> <容器内文件路径> <本地路径>
|
示例:
1
| pct pull 100 /var/log/app.log /root/app-ct100.log
|
在容器内执行文件操作(查看、创建目录等)
1
2
3
4
5
6
7
8
9
10
11
| # 查看文件内容
pct file read <ctid> <容器内文件路径>
# 创建目录
pct file mkdir <ctid> <容器内目录路径>
# 删除文件
pct file delete <ctid> <容器内文件路径>
# 列出目录
pct file list <ctid> <容器内目录路径>
|
示例:
1
2
3
| pct file read 100 /etc/hostname
pct file mkdir 100 /opt/myapp
pct file list 100 /var/log
|
📌 旧版本替代方案:
- 使用
pct exec + cat / echo / mkdir 等命令。 - 使用
scp(需容器内开启 SSH 服务)。
8. 控制台与执行命令
进入容器 Shell (pct enter)
示例:
1
2
3
4
| pct enter 100
# 现在你就在容器的 shell 里了,以 root 身份
root@web-ct01:~# apt update
root@web-ct01:~# exit # 退出
|
在容器内执行单条命令 (pct exec)
1
| pct exec <ctid> -- <命令> [参数...]
|
示例:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
| # 更新包列表
pct exec 100 -- apt update
# 安装 nginx
pct exec 100 -- apt install -y nginx
# 查看 IP 地址
pct exec 100 -- ip addr show eth0
# 重启服务
pct exec 100 -- systemctl restart nginx
# 执行多条命令(用 sh -c)
pct exec 100 -- sh -c "cd /tmp && ls -la"
|
9. 克隆容器 (pct clone)
1
| pct clone <源ctid> <新ctid> [OPTIONS]
|
示例:
1
2
3
4
5
| # 克隆 CT 100 为 CT 101
pct clone 100 101 --hostname clone-ct01 --description "Clone of web-ct01"
# 克隆并指定存储
pct clone 100 102 --storage local-lvm
|
关键选项:
--hostname: 新容器主机名。--description: 描述。--storage: 目标存储。--full 1: 完全克隆(默认)。--full 0: 链接克隆(节省空间,但依赖源容器快照)。
三、高级技巧与脚本示例
1. 批量创建容器脚本
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
| #!/bin/bash
TEMPLATE="/var/lib/vz/template/cache/ubuntu-22.04-standard_22.04-1_amd64.tar.zst"
BASE_ID=200
for i in {1..5}; do
CTID=$((BASE_ID + i))
HOSTNAME="app-server-$i"
echo "Creating container $CTID ($HOSTNAME)..."
pct create $CTID $TEMPLATE \
--hostname $HOSTNAME \
--rootfs local-lvm:4 \
--memory 512 \
--cores 1 \
--net0 name=eth0,bridge=vmbr0,ip=dhcp \
--unprivileged 1 \
--onboot 1 \
--password "DefaultPass$i!" \
--description "Batch created app server"
pct start $CTID
done
|
2. 批量更新所有运行中的容器
1
2
3
4
5
6
7
| #!/bin/bash
for ctid in $(pct list | grep running | awk '{print $1}'); do
echo "Updating container $ctid..."
pct exec $ctid -- apt update
pct exec $ctid -- apt upgrade -y
pct restart $ctid
done
|
3. 获取容器 IP 地址(需容器内有 ip 或 ifconfig)
1
| pct exec 100 -- ip -4 addr show eth0 | grep -oP '(?<=inet\s)\d+(\.\d+){3}'
|
4. 查看容器资源使用(CPU、内存)
1
2
3
4
5
| # 查看状态(包含资源使用概览)
pct status 100 --verbose
# 或使用全局资源查看
pvesh get /nodes/$(hostname)/status --output-format json-pretty
|
四、重要注意事项
- 权限要求:大部分
pct 命令需要 root 或 sudo 权限。 - 配置文件位置:容器配置文件位于
/etc/pve/lxc/<ctid>.conf。 - 根文件系统位置:取决于存储配置,通常在
/var/lib/vz/private/<ctid>/(目录存储)或 LVM/ZFS 卷。 - 非特权容器限制:无法访问某些设备、无法挂载文件系统、部分内核功能受限。如需 Docker,需启用
nesting=1 并可能调整配置。 - 网络配置:容器默认使用
venet 或 veth 网络模式。veth(桥接)更常用,性能更好,支持防火墙。 - 备份首选
vzdump:pct backup 已过时,生产环境请使用 vzdump。 - 在线修改:大部分配置(如内存、CPU、网络)支持在线修改,但部分(如
unprivileged)需要重启或重建容器。
五、总结
pct 命令是管理 Proxmox LXC 容器的终极工具,适用于:
- 快速部署标准化应用环境
- 自动化运维脚本
- 资源监控与批量管理
- CI/CD 流水线中的测试环境
核心优势:
- ⚡ 启动速度极快(秒级)
- 🧩 资源占用极低
- 📦 易于克隆和快照
- 🛠️ 命令行自动化友好
熟练掌握 pct 将极大提升你在 Proxmox 环境中管理 Linux 服务的效率。
建议结合 man pct 查看最新官方文档,并在测试环境中实践。
Happy Containerizing! 🐧📦