こんにちは、吉岡([twitter:@yoshiokatsuneo])です。
昨日、半年ぶりにDockerの新バージョンDocker 1.13がリリースされました。
Docker 1.13では、ついにコンテナ凍結・解凍(CRIU)が実験的機能として試せるようになりました。
コンテナ凍結・解凍では、コンテナを停止後したあと再開できます。
再開時には、プロセスを一から実行するのではなく、停止した時の状態から継続して実行できます。
これにより、コンテナを仮想マシンのスナップショットのように利用できます。
さらに、将来的にはコンテナをマシン間で移動するライブマイグレーションにつながる可能性もある、野心的な機能です。
この記事では、このコンテナ凍結・解凍(CRIU)機能を中心として、Docker 1.13を紹介します。
Docker1.13の変更点
はやる気持ちを抑えて、まずはDocker 1.12からDocker1.13の主な変更点を見てみます。
Introducing Docker 1.13 - Docker Blog
Release v1.13.0 · moby/moby · GitHub
コンテナの凍結・解凍(CRIU)機能の追加(実験的機能)
実験的機能として、コンテナの凍結・解凍(CRIU)が利用できるようになりました。
実験的機能のためのオプション追加
従来、Dockerの実験的機能は別のファイルとして提供されていましたが、dockerデーモン起動時に "--experimental"オプションをつけることで有効にできるようになりました。
コンテナ凍結・解凍のような実験的機能を、より気軽に試せるようになっています。
docker systemコマンドの追加
ディスク容量を確認する、"docker system df"コマンドと、不要なファイルを削除する"docker system prune"コマンドが追加されました。
dockerコマンド名の整理
コマンド数が増えて来たため、コマンド名の整理を行っています。
"list", "start", "history"コマンドは以下のようなコマンドで利用できます。ただし、今までのコマンドもそのまま利用できます。
docker container list docker container start docker image history
サービスログ監視コマンドの追加
以下のコマンドでサービスのログを監視できるようになりました。
docker service logs
コンテナ凍結・解凍(CRIU)とは?
Dockerはシンプルで軽量な仮想環境(コンテナ)です。
コンテナを実行すると、独立したファイルシステム・CPU・メモリ環境上で、プロセスが実行されます。
コンテナ自身は軽量ですが、コンテナ上で実行されるプロセスはリソース(CPU・メモリ・ディスク)を消費します。
そのため、ホスト上で実行できるコンテナの数は限られています。
他のコンテナを実行するためには実行中のコンテナを終了させる必要があります。
コンテナ終了後もファイルは保存されますが、実行中のプロセスは完全に終了してしまい、プロセスに関する情報は全て無くなってしまいます。
コンテナ凍結・解凍(CRIU)では、このプロセスに関する状態をファイルとして保存しておき、再開時にこのファイルからプロセスを復元することで、中断したプロセスについても継続して実行できるようになっています。
コンテナ凍結・解凍(CRIU)を試してみる
それでは、コンテナ凍結・解凍(CRIU)を実際に試してみましょう!
Linux環境(Ubuntu16.04)を用意
コンテナ凍結・解凍(CRIU)を利用するには、CRIUに対応したLinux kernelを利用する必要があります。 (https://criu.org/Installation#Configuring_the_kernel)
Ubuntu16.04のカーネルはCRIUに対応していますので、ここでもUbuntu16.04を利用してみます。
ここでは、AWS上でUbuntu16.04を利用したインスタンスを利用しました。
Dockerのインストール
まず、Dockerをインストールします。
$ sudo /bin/bash # apt-get update # curl -fsSL https://get.docker.com/ | sh # usermod -aG docker ubuntu
CRIUのインストール
コンテナ凍結・解凍(CRIU)を利用するために必要なcriuパッケージをインストールします。
# apt-get install -y criu
Dockerで実験的機能を有効にする
コンテナ凍結・解凍(CRIU)を利用するには、Dockerの実験的機能を有効にする必要があります。
"/etc/docker/daemon.json"ファイルに以下のように記述します。 (または"--experimental"オプションをつけてDockerを起動します。)
/etc/docker/daemon.json
{ "experimental": true }
Dockerを再起動し、実験的機能が有効になっていることを確認します。
# sudo systemctl restart docker # docker version -f '{{.Server.Experimental}}' true
コンテナを実行する
Dockerコンテナを実行してみます。ここでは、毎秒、カウンターと時刻を表示するコマンドをコンテナとして実行してみます。
# docker run --name cr -d busybox /bin/sh -c 'i=0; while true; do echo -n "$i:"; date; i=$(expr $i + 1); sleep 1; done'
コンテナが実行されています。
# docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES e4c8246eae16 busybox "/bin/sh -c 'i=0; ..." 4 seconds ago Up 3 seconds cr
コマンドの出力を確認してみます。カウンタと時刻が表示されています。
# docker logs cr 0:Fri Jan 20 07:27:05 UTC 2017 1:Fri Jan 20 07:27:06 UTC 2017 ... 8:Fri Jan 20 07:27:13 UTC 2017 9:Fri Jan 20 07:27:14 UTC 2017
コンテナを凍結する
それでは、コンテナを凍結してみます。コンテナの凍結には"docker checkpoint"コマンドを利用します。
ここでは、"checkpoint1"という名前で凍結します。
コンテナを凍結してみましょう!
# docker checkpoint create cr checkpoint1 checkpoint1
コンテナは終了しています。
# docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
コンテナを復元する
凍結したコンテナは"docker start --checkpoint"で復元します。
コンテナを復元してみましょう!
# docker start --checkpoint checkpoint1 cr
復元されたコンテナが実行されています。
# docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES e4c8246eae16 busybox "/bin/sh -c 'i=0; ..." 58 seconds ago Up 2 seconds cr
コンテナの出力を確認すると、カウンタや時刻が続きから表示され、コンテナが途中から再開されています!
# docker logs cr ... 7:Fri Jan 20 07:27:12 UTC 2017 8:Fri Jan 20 07:27:13 UTC 2017 9:Fri Jan 20 07:27:14 UTC 2017 10:Fri Jan 20 07:28:01 UTC 2017 11:Fri Jan 20 07:28:02 UTC 2017 12:Fri Jan 20 07:28:03 UTC 2017
まとめ
Docker1.13の概要と実験的新機能のコンテナの凍結・解凍を試してみました。
コンテナの凍結・解凍機能を使うことで、不要な時に停止ても、コンテナの実行を継続することができるようになります。
仮想マシンのスナップショットに近い形で利用したり、実行中のコンテナを移動やコピーすることもできる可能性があります。
Dockerの可能性が広がる機能ですので、試してみてはいかがでしょうか?
関連記事:
- Dockerのすべてが5分でわかるまとめ!(コマンド一覧付き) - paiza開発日誌
- Docker for Mac プライベートベータを早速使ってみた! - paiza開発日誌
- paizaの中の人による2016年のDocker本『Docker実戦活用ガイド』が本日発売! - paiza開発日誌
- ある社内プログラマが初めて技術書(『Docker実戦活用ガイド』)を出版するまで - paiza開発日誌
- 今からでも遅くない! Dockerをしっかり学ぶための書籍全10冊まとめ - paiza開発日誌
- Dockerは危険という誤解と、本当に注意すべき点 - paiza開発日誌
paizaは、技術を追い続けることが仕事につながり、スキルのある人がきちんと評価される場を作ることで、日本のITエンジニアの地位向上を目指したいと考えています。
自分のスキルを磨いていきたいと考えている方におすすめなのが「paizaラーニング」。オンラインでプログラミングしながらスキルアップできる入門学習コンテンツです。初心者でも楽しくプログラミングの基本を学ぶことができます。
そして、paizaでは、Webサービス開発企業などで求められるコーディング力や、テストケースを想定する力などが問われるプログラミングスキルチェック問題も提供しています。
スキルチェックに挑戦した人は、その結果によってS・A・B・C・D・Eの6段階のランクを取得できます。必要なスキルランクを取得すれば、書類選考なしで企業の求人に応募することも可能です。「自分のプログラミングスキルを客観的に知りたい」「スキルを使って転職したい」という方は、ぜひチャレンジしてみてください。