外观
用 OCI 镜像创建容器
以前建 LXC 容器只能用 PVE 官方模板仓库或者自己打包的系统模板。PVE 9.1 起可以直接从 Docker Hub 这类 OCI 镜像注册表拉一个镜像,转换成容器。
应用容器目前是技术预览
用 OCI 镜像建出完整系统容器(带 init 系统的那种)是稳定功能。但用 OCI 镜像建出应用容器(只跑单个进程、没有自己的 init,行为更接近一个 Docker 容器)目前处于技术预览阶段,官方文档明确这样标注。技术预览意味着行为细节还可能随小版本调整,生产环境要用之前先在测试环境验证清楚。
为什么需要它
很多常见服务已经打包成了 OCI/Docker 镜像并发布在公开或私有的注册表里。以前要在 PVE 里用它们,得先建一个系统容器再手动装 Docker、拉镜像、跑起来(见在 LXC 里跑 Docker),多了一层。OCI 支持让你可以跳过这一步,直接把镜像转换成一个 LXC 容器——它依然是一个普通的 LXC 容器,能在 Web UI 管理、能设资源限制、能打快照和备份、能挂 PVE 防火墙,只是根文件系统的来源变成了 OCI 镜像。
开始之前
- PVE 9.1 或以上版本。
- 理解容器还是虚拟机和创建第一个容器里讲的基础概念——OCI 容器最终还是走 LXC 这一套框架,不是单独的运行时。
- 明确这不是 Docker 的替代品:当前技术预览版本会把镜像的所有分层压平成一个根文件系统,没有增量更新机制,升级镜像版本需要重建容器,不能像
docker pull那样原地更新。
操作步骤
第一步:获取 OCI 镜像
Web UI 里,找一个开启了 Container template 内容类型的存储,进入它的 CT Templates 视图,点 Pull from OCI registry:
| 字段 | 说明 |
|---|---|
| Registry / Reference | 例如 registry.hub.docker.com/library/caddy,指定注册表和镜像名 |
| Tag | 点 Query 后会列出可用标签(如 latest、具体版本号),选一个 |
点 Download,PVE 会拉取镜像、转换格式,存成这个存储上的一个模板文件。
私有注册表和来源审查同样适用
创建第一个容器里提到过官方模板要用可信来源。OCI 镜像同理——只从你信任的注册表和镜像名拉取,镜像里同样可以塞任何东西,尤其是来路不明的第三方镜像。
第二步:用这个模板创建容器
下载完成后,它会出现在 Create CT 向导的模板列表里,走向导流程和普通模板完全一样(参考创建第一个容器),或者用命令行:
sh
# 在宿主机 shell 执行,<storage> 换成保存模板的存储 ID
pct create <ctid> <storage>:vztmpl/<下载得到的模板文件名>第三步(仅应用容器):网络托管选项
应用容器通常没有自己完整的网络管理组件。这种情况下可以用 host-managed 网络选项,让宿主机侧直接管理这块网卡的 IP,容器内部不需要跑自己的 DHCP 客户端或网络管理器:
sh
# 在宿主机 shell 执行
pct set <ctid> -net0 name=eth0,bridge=vmbr0,ip=dhcp,host-managed=1检查结果
pct list里容器状态是running。pct config <ctid>能看到这个容器的配置,和普通模板建出来的容器格式一致(rootfs、net0等字段照常存在)。- 进容器确认预期的服务确实在跑:
sh
# 在宿主机 shell 执行
pct exec <ctid> -- ps aux- 应用容器额外确认网络:容器能不能被访问到,
host-managed模式下 IP 是否符合预期。
常见问题
镜像出了新版本,怎么升级? 当前技术预览版本做不到"原地更新"。做法是重新拉取新标签的镜像生成新模板,创建一个新容器替换旧的,数据部分要提前规划成挂载点(见挂载点与 bind mount)而不是留在容器根文件系统里,这样重建容器时数据不会丢。
我想跑好几个互相配合的服务,像 docker-compose 那样。 OCI 容器目前不是编排工具,一个容器对应一个镜像。需要多容器协作的场景,要么给每个服务单独建一个 OCI 容器再自己处理网络互通,要么回到更成熟的路径——用在 LXC 里跑 Docker或者一台跑 Docker 的虚拟机。
需要最大隔离或者要在线迁移这个负载。 LXC 容器本身就不支持在线迁移。这类需求应该把应用跑在虚拟机里,见容器还是虚拟机。
pveam 相关命令找不到 OCI 镜像。 pveam 是面向传统系统模板仓库的工具,OCI 镜像走的是独立的 "Pull from OCI registry" 入口,两者是不同的获取路径。