PVE 9.2 引入了 OCI Application Container(技术预览),可以直接从 Docker Hub 拉取 OCI 镜像并在 LXC 中运行,无需安装 Docker 守护进程。本文对比三种方式,覆盖从原生 OCI 到传统 Docker in VM 的完整方案。
目录
三种方式对比
| 特性 |
方式一:OCI App Container |
方式二:Docker in LXC |
方式三:Docker in VM |
| 是否需要 Docker daemon |
否(PVE 原生运行) |
是 |
是 |
| 隔离性 |
中等(共享内核) |
中等(共享内核) |
高(独立内核) |
| 性能开销 |
极低 |
低 |
中等 |
| 镜像来源 |
Docker Hub / 任意 OCI Registry |
Docker Hub |
Docker Hub |
| 支持 Docker Compose |
否(路线图中) |
是 |
是 |
| PVE 管理集成 |
完全集成(WebUI 管理) |
有限(需进入容器操作) |
有限 |
| 快照/备份 |
PVE 原生支持 |
PVE 原生支持 |
PVE 原生支持 |
| Live Migration |
重启迁移 |
重启迁移 |
支持 |
| 兼容性 |
单进程应用最佳 |
多数 Docker 应用 |
全部 Docker 应用 |
| 状态 |
技术预览 |
成熟 |
成熟 |
方式一:原生 OCI Application Container(PVE 9.x 新功能)
PVE 9.x 引入了 OCI(Open Container Initiative)镜像支持 作为技术预览。你可以直接从 Docker Hub 或任何 OCI 注册表拉取镜像,PVE 会自动将其转换为 LXC 容器运行——不需要安装 Docker。
适用场景
- 运行单进程/单服务的 OCI 镜像(Nginx、Redis、MySQL、PostgreSQL 等)
- 需要 PVE 原生管理(WebUI 创建/监控/备份)
- 不想在系统里装 Docker daemon
拉取 OCI 镜像
方式 A:WebUI 拉取
- 左侧选择节点 → 展开 local (pve1) 存储
- 切换到 CT Templates 标签页
- 点击 Pull from OCI registry
- 输入镜像名称(如
docker.io/library/nginx:latest)
- 点击 Pull,等待下载完成
方式 B:CLI 拉取
pveam update pct oci pull docker.io/library/nginx:latest
pveam list local --oci
|
支持的镜像格式
docker.io/library/nginx:latest docker.io/library/redis:7-alpine docker.io/library/postgres:16 docker.io/library/mysql:8.0 ghcr.io/owner/image:tag registry.example.com/myapp:1.0
|
创建 Application Container
- 点击 Create CT
- General 页:设置 CT ID、密码
- Template 页:选择已下载的 OCI 镜像
- Root Disk:设置磁盘大小
- CPU / Memory:按需分配
- Network:
- 桥接
vmbr0
- 勾选 Host-Managed IP(让宿主管理 IP 配置,容器内不需要 DHCP 客户端)
- 确认并 Finish
CLI 创建
pct create 200 local:oci/nginx:latest \ --storage local-zfs \ --rootfs 4 \ --hostname nginx-app \ --net0 name=eth0,bridge=vmbr0,ip=dhcp,host-managed=1
pct start 200
pct status 200 pct enter 200
|
访问应用
容器启动后,通过 pct enter 200 进入,或通过宿主 IP + 映射端口访问。
由于 Application Container 是单进程容器,PVE 会自动使用 host-managed 网络模式,宿主负责 IP 配置。如需端口映射,可在容器内配置,或结合 PVE Firewall 规则。
PVE 9.2 Application Container 改进
| 改进点 |
说明 |
| /dev/shm tmpfs |
自动挂载 tmpfs 到 /dev/shm,符合 OCI Runtime 规范 |
| OCI User 属性 |
自动识别并应用 OCI 镜像中的 USER 指令 |
| idmap 挂载选项 |
支持对单个挂载点自定义 UID/GID 映射 |
| keepattrs 选项 |
继承已有挂载点目录的属主和权限 |
注意事项
- Application Container 是 技术预览,不建议用于关键生产环境
- 适合单进程应用,复杂多进程/有 init 系统的镜像可能不兼容
- Docker Compose 支持在路线图中,暂时不支持
- 部分需要特殊内核模块或设备直通的应用可能需要 Docker in VM
方式二:Docker in LXC 容器
在 LXC 容器内安装 Docker daemon,是 PVE 上部署 Docker 应用最常用的方式。PVE 9.2 新增的 idmap 和 keepattrs 挂载选项让权限管理更灵活。
准备工作:创建 LXC 容器
- 创建容器:使用 Ubuntu 24.04 或 Debian 12 模板
- 关键配置:
| 配置项 |
必须 |
说明 |
| Unprivileged container |
否 |
默认即可,但 Docker 需特殊配置 |
| Nesting |
是 |
必须启用,容器的容器(Docker)需要 |
| 特权容器 |
推荐 |
非受信环境建议用 VM |
在 WebUI 中配置
创建 CT 时在 Options 标签页:
- Unprivileged → 取消勾选(使用特权容器,Docker 兼容性更好)
- Nesting → 勾选
或创建后用 CLI 修改:
pct set 100 -features nesting=1 pct set 100 -unprivileged 0 pct reboot 100
|
安装 Docker
进入容器,安装 Docker:
pct enter 100
apt update apt install -y docker.io
curl -fsSL https://get.docker.com | sh
docker --version docker run hello-world
|
PVE 9.2 新特性:idmap 挂载点
PVE 9.2 新增 idmap 和 keepattrs 挂载选项,解决 Docker 卷挂载中的权限问题。
场景:将宿主目录挂载到容器供 Docker 使用
mkdir -p /mnt/bindmounts/docker-data
pct set 100 -mp0 /mnt/bindmounts/docker-data,mp=/data,idmap=passthrough
pct set 100 -mp1 /mnt/bindmounts/docker-data,mp=/appdata,idmap=u:0:100000:65536;g:0:100000:65536
|
idmap 参数详解:
| 值 |
效果 |
passthrough |
直接穿透,容器内 ID = 宿主 ID |
u:容器UID:宿主UID:数量;g:容器GID:宿主GID:数量 |
自定义映射范围 |
u:0:100000:65536 |
将容器内 UID 0-65535 映射到宿主 UID 100000-165535 |
keepattrs 选项
pct set 100 -mp2 /mnt/bindmounts/data,mp=/persistent,keepattrs=1
|
Docker Compose 示例
pct enter 100
apt install -y docker-compose-plugin
mkdir -p /opt/stack && cd /opt/stack
cat > compose.yml << 'EOF' services: nginx: image: nginx:alpine ports: - "80:80" volumes: - ./html:/usr/share/nginx/html
redis: image: redis:7-alpine
app: image: your-app:latest depends_on: - redis EOF
docker compose up -d
|
性能优化
docker info | grep Storage
cat > /etc/docker/daemon.json << 'EOF' { "log-driver": "json-file", "log-opts": { "max-size": "10m", "max-file": "3" } } EOF systemctl restart docker
|
安全性建议
pct set 100 -memory 2048 -swap 512 -cores 2
groupadd docker usermod -aG docker your-user
export DOCKER_CONTENT_TRUST=1
pct enter 100 -- apt update && apt upgrade -y
|
方式三:Docker in VM 虚拟机
在完整的虚拟机中安装 Docker,获得最高级别的隔离性。适合多租户、不信任的工作负载、需要 Live Migration 的场景。
创建 VM
- Create VM → 选择 Ubuntu Server / Debian ISO
- System:BIOS →
OVMF (UEFI),勾选 Qemu Agent
- Disks:
VirtIO Block,建议 20 GB+
- CPU:Type →
host
- Network:
VirtIO (paravirtualized)
安装 Docker
curl -fsSL https://get.docker.com | sh
apt install -y docker-compose-plugin
docker run hello-world
|
Docker Compose 部署完整栈
services: traefik: image: traefik:v3.1 container_name: traefik ports: - "80:80" - "443:443" volumes: - /var/run/docker.sock:/var/run/docker.sock:ro - ./traefik.yml:/traefik.yml:ro labels: - "traefik.enable=true"
portainer: image: portainer/portainer-ce:latest container_name: portainer ports: - "9000:9000" volumes: - /var/run/docker.sock:/var/run/docker.sock:ro - portainer_data:/data
watchtower: image: containrrr/watchtower container_name: watchtower volumes: - /var/run/docker.sock:/var/run/docker.sock:ro
volumes: portainer_data:
|
VM 专用优化
apt install -y qemu-guest-agent
|
场景选择指南
选 Application Container(OCI)
你只需要跑一个 Nginx/Redis/PostgreSQL 单服务 → 不想装 Docker → 想用 PVE WebUI 统一管理 → 愿意接受技术预览的稳定性 → 选 OCI Application Container
|
选 Docker in LXC
你需要 Docker Compose 编排多个服务 → 需要极低开销 → 不需要 Live Migration → 服务在可信环境运行 → 选 Docker in LXC
|
选 Docker in VM
多租户 / 不信任的工作负载 → 需要 Live Migration / 高可用 → 需要完整内核隔离 → 需要运行特殊内核模块 → 生产环境核心服务 → 选 Docker in VM
|
混合使用
实际部署中,三种方式可以混合使用:
PVE Host ├── OCI App Container: Nginx (反向代理) ├── LXC + Docker: Compose 应用栈 (WordPress + MySQL) ├── VM + Docker: 核心业务 + Portainer 管理 └── LXC + Docker: 开发/测试环境
|
所有容器/虚拟机统一通过 PVE WebUI 管理备份、快照、监控。
常见问题
Q1:Application Container 拉取镜像失败?
pct oci pull ghcr.io/owner/image:tag
df -h
|
Q2:LXC 内 Docker 报 “failed to create cgroup”?
pct set CTID -features nesting=1
echo "lxc.cgroup2.memory.max: 1073741824" >> /etc/pve/lxc/CTID.conf pct reboot CTID
|
Q3:Docker in LXC 磁盘权限问题?
pct set CTID -mp0 /mnt/bindmounts/data,mp=/data,idmap=passthrough
services: app: user: "1000:1000" volumes: - ./data:/data
|
Q4:OCI App Container 和 Docker in LXC 性能对比?
OCI App Container 略优(无 Docker daemon 开销),但实际差异通常 < 5%。选择时优先考虑功能和隔离需求,而非性能。
Q5:Application Container 的 Compose 支持何时可用?
PVE 路线图显示 Compose Specification 支持正在开发中(技术预览阶段),会在后续版本逐步推出。当前可用 pct 命令结合 Shell 脚本编排多容器。
Q6:Docker in VM 性能损耗大吗?
使用 VirtIO 设备 + CPU host 模式 + IO Thread,性能损耗通常在 5-10% 以内。适合绝大多数生产场景。
总结
Proxmox VE 9.2 提供了三种运行容器化应用的方式,覆盖从轻量到全隔离的全场景:
OCI App Container ├── 无需 Docker ├── PVE WebUI 原生管理 ├── 技术预览 └── 适合单服务
Docker in LXC ├── 需 Docker daemon ├── PVE 9.2 idmap/keepattrs ├── 成熟稳定 └── 适合 Compose 栈
Docker in VM ├── 完全隔离 ├── Live Migration 支持 ├── 最成熟 └── 适合生产关键业务
|
对于探索新功能的用户,OCI Application Container 值得一试——它代表了 PVE 容器化管理的未来方向。对于生产环境,Docker in VM 仍然是最稳妥的选择。
本文最后更新于 2026 年 6 月,对应 Proxmox VE 9.2-1。Application Container 为技术预览功能。