2014/6の時点ではCRIUを使ってDockerコンテナの停止/再開はできないという少し残念な結果でこの記事は終わります。記事を読んでもらえればCRIUの面白さはわかってもらえると思います。Dockerが急速に広まったことで、LXCがVMWareやXenなどのVMに対して持つ利点はとても明確になりました。VMにあってLXCにはない機能が一つあります。それは、コンテナの停止/再開によるコンテナの状態の保存です。ここでCRIUの出番です。CRIUはいわゆるCR(checkpoint/restart)ツールです。走っているプロセスを途中で止めてファイルに保存して、いつでも途中からプロセスを再開することができます。LXCコンテナはプロセスなので、CRIUを使えばコンテナの停止/再開ができそうな気がしますが、本当にできるでしょうか?この記事では、CRIUをインストールしてDockerコンテナの停止/再開ができるかどうか試してみます。CRIUをインスールするカーネルを再構築するCRIUを動かすためには、CRIUが必要とするカーネルパラメータが有効になったカーネルを使わないといけません。Boxで必要なカーネルパラメータが有効になっているものはなさそうでした。カーネルの再構築から始めないといけません。カーネルの再構築と言うと敷居が高そうですが、実際はとても簡単です。imageを使います。このボックスを追加します。コマンドを打つ前に、CPUとメモリーを増やしましょう。遅いマシンだと再構築にはとても時間がかかります。2コア、2048Mのメモリがあれば大丈夫だと思います。エディタで開いて、以下を追加してください。sshしてログインしてください。rootユーザになって再構築に必要なパッケージをインストールします。いうディレクトリが作成されているはずです。そのディレクトリに移動します。version>次はカーネルのコンフィグファイルが必要になります。gistにアップロードしたのを使ってもらえれば、自分でコンフィグをする必要はありません。以下のコマンドを入力してください。.configもし、CRIUを動かすためにどのオプションが必要か知りたい場合はここにリストがあります。.configファイルを準備したら、再構築の準備完了です。一度確認してください。CPUとメモリは増やしましたか?もししていないと、とても長い時間待たされることになります。ディレクトリに作成された思います。インストールしましょう。reboot再起動したらCRIUが使えるカーネルで動いているはずです。CRIUをソースからコンパイルする次はCRIUをインストールします。Ubuntuは最新のパッケージを用意していないので、自分でソースからコンパイルしないといけません。/usr/local/sbin/これでCRIUのインストールは完了です。インストールされているか確認しましょう。CRIUにはそのためのコマンドがあります。good.が表示されましたか?いくつか警告がでますが、無視して構いません。コンテナに対して使う前に、まずは普通のプロセスを停止/再開してみましょう。以下の例はCRIUのHOWTOページからです。ループするだけのスクリプトを用意します。dumpコマンドを使います。--shell-jobもし、ダンプが成功したら/tmp/testディレクトリ配下に沢山のファイルができているはずです。signal-s-4898.img今度はプロセスを再開してみましょう。restoreコマンドを使います。--shell-jobプロセスが問題なく再開されたらtest.shがdateコマンドの出力をターミナルに出すはずです。CRIUでコンテナを停止/再開してみるここまでは大丈夫ですか?では、いよいよDockerコンテナに使ってみましょう。DockerはこのVagrantにはインストールされていないので、まずインストールしましょう。/etc/bash_completion.d/docker.ioインストールしたら、簡単なコマンドをコンテナに実行させます。/bin/bashコンテナを停止するにはプロセスIDを知る必要があります。'.[0].State.Pid'`いよいよ、苦労が報われる時です。FAILED.あれ?CRIUはエラーを吐いてしまいました。ダンプに失敗したようです。エラーメッセージをGoogleで調べてみると、以下のスレッドを見つけました。現状のCRIUではLXCのの停止/再開はできないみたいです。ここのページにはCRIUを使ってLXCを停止/再開する方法が書かれていますよ。以下は同じスレッドに書かれていました。:)要するに、CRIUはcgroupsを2014/06の時点ではサポートしていないらしいです。Dockerが使っているLXCのテンプレートはcgroupsを使っているようです。よって、CRIUではDockerコンテナの停止/再開はできないみたいです。v1.3ではDockerコンテナの停止/再開はできないことがわかりました。CRIUがまだcgroupsに対応していないからです。今回は少し残念な結果になってしまいましたが、ここまで読んでもらえた方にはCRIUの可能性がわかってもらえたかと思います。CRIUがLXCのエコシステムにもたらす将来の可能性に対して、このプロジェクトの認知度はとても低いです。この記事を読んでくださった方は、今すぐGithubでスターしてウォッチしましょう!このブログでもこれから色々CRIUについて書いて行きたいと思います。