22.3. 在系统间迁移容器
您可以将正在运行的容器从一个系统迁移到另一个系统,而不丢失容器中运行的应用程序的状态。本示例基于本地创建并恢复一个容器检测点 中的内容,使用 counter
tag。
只有在系统配置完全匹配时,才支持使用 podman container checkpoint
和 podman container restore
命令在系统间迁移容器,如下所示:
- Podman 版本
- OCI 运行时(runc/crun)
- 网络堆栈(CNI/Netavark)
- Cgroups 版本
- 内核版本
- CPU 功能
您可以迁移到具有更多功能的 CPU,但不能迁移到没有您使用的特定功能的 CPU。低级工具执行检查点(CRIU)可能检查 CPU 功能兼容性 :https://criu.org/Cpuinfo。
先决条件
-
container-tools
元数据包已安装。 如果容器被推送到注册表,则不需要执行下列步骤,因为 Podman 将自动从注册表下载容器(如果本地没有的话)。本例没有使用注册中心,您必须导出之前构建并标记的容器(请参阅 在本地创建和恢复容器检查点)。
导出之前构建的容器:
podman save --output counter.tar counter
# podman save --output counter.tar counter
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 将导出的容器镜像复制到目标系统(
other_host)
:scp counter.tar other_host:
# scp counter.tar other_host:
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 在目的系统中导入导出的容器:
ssh other_host podman load --input counter.tar
# ssh other_host podman load --input counter.tar
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 现在,此容器迁移的目标系统在其本地容器存储中有一个同样的容器镜像。
流程
以 root 用户身份启动容器:
podman run --name criu-test --detach counter
# podman run --name criu-test --detach counter
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 显示容器的 IP 地址:
podman inspect criu-test --format "{{.NetworkSettings.IPAddress}}"
# podman inspect criu-test --format "{{.NetworkSettings.IPAddress}}" 10.88.0.247
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 将请求发送到容器:
curl 10.88.0.247:8080 curl 10.88.0.247:8080
# curl 10.88.0.247:8080 0 # curl 10.88.0.247:8080 1
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 创建容器的检查点,并将检查点镜像导出到
tar.gz
文件中:podman container checkpoint criu-test --export /tmp/chkpt.tar.gz
# podman container checkpoint criu-test --export /tmp/chkpt.tar.gz
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 将 checkpoint 归档复制到目标主机:
scp /tmp/chkpt.tar.gz other_host:/tmp/
# scp /tmp/chkpt.tar.gz other_host:/tmp/
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 在目标主机上恢复检查点(
other_host
):podman container restore --import /tmp/chkpt.tar.gz
# podman container restore --import /tmp/chkpt.tar.gz
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 向目标主机上的容器(
other_host
)发送一个请求:*curl 10.88.0.247:8080*
# *curl 10.88.0.247:8080* 2
Copy to Clipboard Copied! Toggle word wrap Toggle overflow
因此,有状态的容器已从一个系统迁移到另一个系统,而不丢失其状态。