| # checkpoint | |
| <!---MARKER_GEN_START--> | |
| Manage checkpoints | |
| ### Subcommands | |
| | Name | Description | | |
| |:---------------------------------|:---------------------------------------------| | |
| | [`create`](checkpoint_create.md) | Create a checkpoint from a running container | | |
| | [`ls`](checkpoint_ls.md) | List checkpoints for a container | | |
| | [`rm`](checkpoint_rm.md) | Remove a checkpoint | | |
| <!---MARKER_GEN_END--> | |
| ## Description | |
| Checkpoint and Restore is an experimental feature that allows you to freeze a running | |
| container by specifying a checkpoint, which turns the container state into a collection of files | |
| on disk. Later, the container can be restored from the point it was frozen. | |
| This is accomplished using a tool called [CRIU](https://criu.org), which is an | |
| external dependency of this feature. A good overview of the history of | |
| checkpoint and restore in Docker is available in this | |
| [Kubernetes blog post](https://kubernetes.io/blog/2015/07/how-did-quake-demo-from-dockercon-work/). | |
| ### Installing CRIU | |
| If you use a Debian system, you can add the CRIU PPA and install with `apt-get` | |
| [from the CRIU launchpad](https://launchpad.net/~criu/+archive/ubuntu/ppa). | |
| Alternatively, you can [build CRIU from source](https://criu.org/Installation). | |
| You need at least version 2.0 of CRIU to run checkpoint and restore in Docker. | |
| ### Use cases for checkpoint and restore | |
| This feature is currently focused on single-host use cases for checkpoint and | |
| restore. Here are a few: | |
| - Restarting the host machine without stopping/starting containers | |
| - Speeding up the start time of slow start applications | |
| - "Rewinding" processes to an earlier point in time | |
| - "Forensic debugging" of running processes | |
| Another primary use case of checkpoint and restore outside of Docker is the live | |
| migration of a server from one machine to another. This is possible with the | |
| current implementation, but not currently a priority (and so the workflow is | |
| not optimized for the task). | |
| ### Using checkpoint and restore | |
| A new top level command `docker checkpoint` is introduced, with three subcommands: | |
| - `docker checkpoint create` (creates a new checkpoint) | |
| - `docker checkpoint ls` (lists existing checkpoints) | |
| - `docker checkpoint rm` (deletes an existing checkpoint) | |
| Additionally, a `--checkpoint` flag is added to the `docker container start` command. | |
| The options for `docker checkpoint create`: | |
| ```console | |
| 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 | |
| ``` | |
| And to restore a container: | |
| ```console | |
| Usage: docker start --checkpoint CHECKPOINT_ID [OTHER OPTIONS] CONTAINER | |
| ``` | |
| Example of using checkpoint and restore on a container: | |
| ```console | |
| $ 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 | |
| ``` | |
| This process just logs an incrementing counter to stdout. If you run `docker logs` | |
| in-between running/checkpoint/restoring, you should see that the counter | |
| increases while the process is running, stops while it's frozen, and | |
| resumes from the point it left off once you restore. | |
| ### Known limitations | |
| `seccomp` is only supported by CRIU in very up-to-date kernels. | |
| External terminals (i.e. `docker run -t ..`) aren't supported. | |
| If you try to create a checkpoint for a container with an external terminal, | |
| it fails: | |
| ```console | |
| $ 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 | |
| ``` |