docker checkpoint

内容説明チェックポイントを管理します。
利用方法docker checkpoint

試験的

このコマンドは試験的なものです。

試験的機能はテスト向けに意図されたものであり、その機能に関してのフィードバックを得る目的があります。 この機能はリリース時に予告なく変更される場合があり、また今後のリリースに向けて削除されることがあります。

内容説明

チェックポイントとリストアは試験的な機能です。 この機能を用いるとチェックポイントを指定して実行中コンテナーを一時停止させることができます。 コンテナーの状態はディスク上の一連のファイルに変換されます。 後にコンテナーは一時停止されたポイントから回復させることができます。

この機能は CRIU と呼ばれる外部依存ツールを使って実現しています。 Docker におけるチェックポイントとリストアに関する開発経緯については Kubernetes ブログポスト にまとめられています。

CRIU のインストール

Debian システムを利用している場合、CRIU PPA を追加することで CRIU launchpad から apt-get を使ってインストールすることができます。

別の方法として CRIU をソースからビルド することもできます。

Docker におけるチェックポイントとリストア機能を利用するには、CRIU のバージョンが最低でも 2.0 でなければなりません。

チェックポイントとリストアのユースケース

本機能は今のところ、単一のホストについてチェックポイントとリストアを行うことを想定しています。 ユースケースとしていくつかをあげます。

  • コンテナーを停止/再起動することなく、ホストマシンを再起動できます。
  • 起動に時間がかかるアプリケーションの初動を早めることができます。
  • プロセスを以前の時点に「巻き戻す」ことができます。
  • 実行プロセスを「フォレンジックに (法的に) デバッグ」することができます。

チェックポイントとリストアについてよく見られるユースケースは、1 つのマシン上のサーバーを別のマシンにライブ移行することです。 これは現時点の実装において可能ですが、ただし今のところ優先度は高く設定されていません (したがってこのタスクに対する作業は最適には行われていません)。

チェックポイントとリストアの利用

トップレベルコマンド docker checkpoint が導入されており、そこに 3 つのサブコマンドがあります。

  • 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チェックポイントを削除します。