docker checkpoint

说明管理检查点
用法docker checkpoint

实验性功能

此命令为实验性功能。

实验性功能旨在用于测试和反馈,其功能或设计可能会在不同版本之间发生变化而无警告,或者在将来的版本中完全删除。

说明

检查点与恢复(Checkpoint and Restore)是一项实验性功能,通过指定检查点来冻结正在运行的容器,这会将容器状态转换为磁盘上的文件集合。之后,可以从容器冻结时的状态恢复容器。

这是通过一个名为 CRIU 的工具实现的,CRIU 是此功能的外部依赖项。关于 Docker 中检查点与恢复历史的详细概述,请参阅这篇 Kubernetes 博客文章

安装 CRIU

如果您使用 Debian 系统,可以添加 CRIU PPA 并使用 apt-get 从 CRIU Launchpad 安装

或者,您可以从源代码构建 CRIU

您需要至少 2.0 版本的 CRIU 才能在 Docker 中运行检查点与恢复功能。

检查点与恢复的使用场景

此功能目前主要关注单主机环境下的检查点与恢复使用场景。以下是一些示例:

  • 在不停止/启动容器的情况下重启主机
  • 加快启动时间较慢的应用的启动速度
  • 将进程“回溯”到先前的时间点
  • 对运行中的进程进行“取证调试”

检查点与恢复在 Docker 之外的另一个主要使用场景是将服务器从一台机器实时迁移到另一台机器。目前的实现可以支持这一点,但这目前不是优先事项(因此工作流程并未针对此任务进行优化)。

使用检查点与恢复

引入了一个新的顶级命令 docker checkpoint,它包含三个子命令:

  • docker checkpoint create (创建新的检查点)
  • docker checkpoint ls (列出现有检查点)
  • docker checkpoint rm (删除现有检查点)

此外,docker container start 命令中添加了 --checkpoint 标志。

docker checkpoint create 的选项

Usage:  docker checkpoint create [OPTIONS] CONTAINER CHECKPOINT

Create a checkpoint from a running container

  --leave-running=false    Leave the container running after checkpoint
  --checkpoint-dir         Use a custom checkpoint storage directory

以及恢复容器

Usage:  docker start --checkpoint CHECKPOINT_ID [OTHER OPTIONS] CONTAINER

在容器上使用检查点与恢复的示例

$ docker run --security-opt=seccomp:unconfined --name cr -d busybox /bin/sh -c 'i=0; while true; do echo $i; i=$(expr $i + 1); sleep 1; done'
abc0123

$ docker checkpoint create cr checkpoint1

# <later>
$ docker start --checkpoint checkpoint1 cr
abc0123

这个进程只会向标准输出(stdout)记录一个递增的计数器。如果您在运行/检查点/恢复之间运行 docker logs,您应该会看到计数器在进程运行时增加,在冻结时停止,并在恢复后从停止的地方继续。

已知限制

seccomp 仅在非常新的内核中由 CRIU 支持。

不支持外部终端(即 docker run -t ..)。如果您尝试为带有外部终端的容器创建检查点,将会失败。

$ docker checkpoint create cr checkpoint1
Error response from daemon: Cannot checkpoint container c1: rpc error: code = 2 desc = exit status 1: "criu failed: type NOTIFY errno 0\nlog file: /var/lib/docker/containers/eb62ebdbf237ce1a8736d2ae3c7d88601fc0a50235b0ba767b559a1f3c5a600b/checkpoints/checkpoint1/criu.work/dump.log\n"

$ cat /var/lib/docker/containers/eb62ebdbf237ce1a8736d2ae3c7d88601fc0a50235b0ba767b559a1f3c5a600b/checkpoints/checkpoint1/criu.work/dump.log
Error (mount.c:740): mnt: 126:./dev/console doesn't have a proper root mount

子命令

命令说明
docker checkpoint create从正在运行的容器创建检查点
docker checkpoint ls列出容器的检查点
docker checkpoint rm删除检查点