22.3. 在系统间迁移容器
您可以将正在运行的容器从一个系统迁移到另一个系统,而不会丢失容器中运行的应用程序的状态。本例是基于标记为 counter
的 在本地创建和恢复容器检查点 部分中的容器。
只有在系统配置完全匹配时,才支持使用 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
将导出的容器镜像复制到目标系统(
other_host)
:# scp counter.tar other_host:
在目的系统中导入导出的容器:
# ssh other_host podman load --input counter.tar
现在,此容器迁移的目标系统在其本地容器存储中有一个同样的容器镜像。
流程
以 root 用户身份启动容器:
# podman run --name criu-test --detach counter
显示容器的 IP 地址:
# podman inspect criu-test --format "{{.NetworkSettings.IPAddress}}" 10.88.0.247
将请求发送到容器:
# curl 10.88.0.247:8080 0 # curl 10.88.0.247:8080 1
创建容器的检查点,并将检查点镜像导出到
tar.gz
文件中:# podman container checkpoint criu-test --export /tmp/chkpt.tar.gz
将 checkpoint 归档复制到目标主机:
# scp /tmp/chkpt.tar.gz other_host:/tmp/
在目标主机上恢复检查点(
other_host
):# podman container restore --import /tmp/chkpt.tar.gz
向目标主机上的容器(
other_host
)发送一个请求:# *curl 10.88.0.247:8080* 2
因此,有状态的容器已从一个系统迁移到另一个系统,而不丢失其状态。