読者です 読者をやめる 読者になる 読者になる

paiza開発日誌

paiza(https://paiza.jp ギノ株式会社)の開発者が開発の事、プログラミングネタ、ITエンジニアの転職などについて書いています。

Docker 1.13リリース!新機能、コンテナ凍結・解凍(CRIU)を試してみた!

f:id:paiza:20160607145104p:plain

f:id:paiza:20151217152725j:plainこんにちは、吉岡(@)です。

昨日、半年ぶりに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 · docker/docker · 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の可能性が広がる機能ですので、試してみてはいかがでしょうか?


関連記事:


paizaではITエンジニアとしてのスキルレベル測定(9言語に対応)や、プログラミング問題による学習コンテンツ(paiza Learning)を提供(こちらは21言語に対応)しています。テストの結果によりS,A,B,C,D,Eの6段階でランクが分かります。自分のプログラミングスキルを客観的に知りたいという方は是非チャレンジしてみてください。

http://paiza.jp




プログラミング入門講座|paizaラーニング

PHP入門編Ruby入門編Python入門編Java入門編JavaScript入門編C言語入門編C#入門編アルゴリズム入門編