第 22 章 创建并恢复容器检查点
Checkpoint/Restore in Userspace(CRIU)是一个软件,可让您在正在运行的容器或独立应用程序中设置检查点,并将它的状态保存到磁盘中。您可以在重启时同时使用保存的数据来恢复容器。
内核不支持 AArch64 上的预复制检查点。
22.1. 本地创建并恢复容器检查点
这个示例基于 Python 的 web 服务器,该服务器会返回一个整数,它会在每个请求后递增。
先决条件
-
container-tools
元数据包已安装。
流程
创建基于 Python 服务器:
# cat counter.py #!/usr/bin/python3 import http.server counter = 0 class handler(http.server.BaseHTTPRequestHandler): def do_GET(s): global counter s.send_response(200) s.send_header('Content-type', 'text/html') s.end_headers() s.wfile.write(b'%d\n' % counter) counter += 1 server = http.server.HTTPServer(('', 8088), handler) server.serve_forever()
使用以下定义创建容器:
# cat Containerfile FROM registry.access.redhat.com/ubi9/ubi COPY counter.py /home/counter.py RUN useradd -ms /bin/bash counter RUN dnf -y install python3 && chmod 755 /home/counter.py USER counter ENTRYPOINT /home/counter.py
容器基于通用基础镜像(UBI 8)并使用基于 Python 的服务器。
构建容器:
# podman build . --tag counter
文件
counter.py
和Containerfile
是容器构建进程(podman build
)的输入。构建的镜像存储在本地,并使用标签counter
进行标记。以 root 用户身份启动容器:
# podman run --name criu-test --detach counter
要列出所有正在运行的容器,请输入:
# podman ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES e4f82fd84d48 localhost/counter:latest 5 seconds ago Up 4 seconds ago criu-test
显示容器的 IP 地址:
# podman inspect criu-test --format "{{.NetworkSettings.IPAddress}}" 10.88.0.247
将请求发送到容器:
# curl 10.88.0.247:8088 0 # curl 10.88.0.247:8088 1
为容器创建一个检查点:
# podman container checkpoint criu-test
- 重启系统:
恢复容器:
# podman container restore --keep criu-test
将请求发送到容器:
# curl 10.88.0.247:8080 2 # curl 10.88.0.247:8080 3 # curl 10.88.0.247:8080 4
现在,这个结果不会再次从
0
开始,而是从之前的值开始。
这样,您可以通过重新引导轻松保存完整的容器状态。
其他资源