Featured image of post ProxmoxVE 如何使用 pct 命令管理 LXC 容器?

ProxmoxVE 如何使用 pct 命令管理 LXC 容器?

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:8local:8,format=subvol
--memory内存限制 (MB)512
--swap交换空间大小 (MB)512
--coresCPU 核心数1
--cpuunitsCPU 权重(默认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=dhcpip=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
pct config <ctid>

示例输出:

1
pct config 100
 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
pct enter <ctid>

示例:

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 地址(需容器内有 ipifconfig

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

四、重要注意事项

  1. 权限要求:大部分 pct 命令需要 rootsudo 权限。
  2. 配置文件位置:容器配置文件位于 /etc/pve/lxc/<ctid>.conf
  3. 根文件系统位置:取决于存储配置,通常在 /var/lib/vz/private/<ctid>/(目录存储)或 LVM/ZFS 卷。
  4. 非特权容器限制:无法访问某些设备、无法挂载文件系统、部分内核功能受限。如需 Docker,需启用 nesting=1 并可能调整配置。
  5. 网络配置:容器默认使用 venetveth 网络模式。veth(桥接)更常用,性能更好,支持防火墙。
  6. 备份首选 vzdumppct backup 已过时,生产环境请使用 vzdump
  7. 在线修改:大部分配置(如内存、CPU、网络)支持在线修改,但部分(如 unprivileged)需要重启或重建容器。

五、总结

pct 命令是管理 Proxmox LXC 容器的终极工具,适用于:

  • 快速部署标准化应用环境
  • 自动化运维脚本
  • 资源监控与批量管理
  • CI/CD 流水线中的测试环境

核心优势

  • 启动速度极快(秒级)
  • 🧩 资源占用极低
  • 📦 易于克隆和快照
  • 🛠️ 命令行自动化友好

熟练掌握 pct 将极大提升你在 Proxmox 环境中管理 Linux 服务的效率。

建议结合 man pct 查看最新官方文档,并在测试环境中实践。

Happy Containerizing! 🐧📦

持续学习,共同进步! 🚀
使用 Hugo 构建
主题 StackJimmy 设计