Docker检查点

描述管理检查点
用法docker checkpoint

该命令是实验性的

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

描述

检查点和恢复是一项实验性功能,允许您通过指定检查点来冻结正在运行的容器,从而将容器状态转换为磁盘上的文件集合。随后,容器可以从冻结点恢复。

这是使用名为CRIU的工具来完成的 ,它是此功能的外部依赖项。这篇Kubernetes 博客文章很好地概述了 Docker 中检查点和恢复的历史 。

安装 CRIU

如果您使用 Debian 系统,则可以添加 CRIU PPA 并apt-get 从 CRIU 启动板进行安装。

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

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

检查点和恢复的用例

此功能目前主要针对用于检查点和恢复的单主机用例。以下是一些:

  • 重新启动主机而不停止/启动容器
  • 加快慢启动应用程序的启动时间
  • “倒带”流程到较早的时间点
  • 正在运行的进程的“取证调试”

Docker 外部检查点和恢复的另一个主要用例是将服务器从一台机器实时迁移到另一台机器。这在当前实现中是可能的,但目前不是优先事项(因此工作流程未针对该任务进行优化)。

使用检查点和恢复

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

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

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

选项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

此过程只是将递增计数器记录到标准输出。如果您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删除检查点