ちょっと話題の記事

Docker 1.3の新機能を試してみる

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

はじめに

boot2docker + figで始めるDockerコンテナ・オーケストレーションで書いた通り、Docker 1.3がリリースされました。

今回はDocker 1.3の新機能を試してみたいと思います!

やってみた

docker exec

起動しているコンテナに対してプロセスを実行するdocker execコマンドが追加されました。例えば以下のようにコンテナを起動します。

$ docker run -d dockerfile/elasticsearch
7fa04e67eec8e44dd6f84f58eb74d7130dd5cdf3b13091f0369b2da2a30a78f9

docker psコマンドで確認すると、コンテナがバックグラウンドで起動していることが分かります。

$ docker ps
CONTAINER ID        IMAGE                             COMMAND                CREATED             STATUS              PORTS                NAMES
7fa04e67eec8        dockerfile/elasticsearch:latest   "/elasticsearch/bin/   28 hours ago        Up 2 seconds        9200/tcp, 9300/tcp   prickly_almeida

ではdocker execコマンドを使って、起動中のコンテナに対しps auxコマンドを実行してみます。すると以下のように、コンテナ内のプロセス情報が結果として返ってきます!

$ docker exec 7fa04e67eec8 ps aux
USER       PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
root         1  8.1  8.6 3409512 177684 ?      Ssl  00:57   0:08 /usr/lib/jvm/java-7-oracle/bin/java -Xms256m -Xmx1g -Xss256k -Djava.awt.headless=true -XX:+UseParNewGC -XX:+UseConcMarkSweepGC -XX:CMSInitiatingOccupancyFraction=75 -XX:+UseCMSInitiatingOccupancyOnly -XX:+HeapDumpOnOutOfMemoryError -XX:+DisableExplicitGC -Delasticsearch -Des.foreground=yes -Des.path.home=/elasticsearch -cp :/elasticsearch/lib/elasticsearch-1.3.2.jar:/elasticsearch/lib/*:/elasticsearch/lib/sigar/* org.elasticsearch.bootstrap.Elasticsearch
root        78  8.0  0.1  15572  2084 ?        R    00:59   0:00 ps -aux

さらに-itオプションを付与することで、インタラクティブにプロセスを実行することができます。/bin/bashを実行するとプロンプトが表示され、コンテナ内で任意の操作が可能になります。

$ docker exec -it 7fa04e67eec8 /bin/bash
[ root@7fa04e67eec8:/data ]$ ps aux
USER       PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
root         1  6.4  8.6 3409512 177684 ?      Ssl  00:57   0:10 /usr/lib/jvm/java-7-oracle/bin/java -Xms256m -Xmx1g -Xss256k -Djava.awt.headless=true -XX:+UseParNewGC -XX
root        83  1.1  0.2  19312  4472 ?        S    01:00   0:00 /bin/bash
root       105  0.0  0.1  15572  2120 ?        R+   01:00   0:00 ps aux

これで起動中のコンテナのデバッグや状態確認ができます。便利!

docker create

docker runを実行した場合、コンテナを作成し起動、という処理を一度に行ってくれていました。新しく追加されたdocker createコマンドでは、コンテナを作成するだけで、起動まではしません。例えば以下のようにコンテナが無い状態で...

$ docker ps -a
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES

docker createしてみます。

$ docker create dockerfile/elasticsearch
1d05afdfb56ff12cca7f0bafca2d42aa09723d33db3e06b4dca8c6fb50ee2901

するとコンテナは出来上がりますが...

$ docker ps -a
CONTAINER ID        IMAGE                             COMMAND                CREATED             STATUS              PORTS               NAMES
1d05afdfb56f        dockerfile/elasticsearch:latest   "/elasticsearch/bin/   28 hours ago                                                angry_curie

コンテナは起動していません。

$  docker ps
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES

docker startすることでコンテナが起動します。

$ docker start 1d05afdfb56f
1d05afdfb56f

$ docker ps
CONTAINER ID        IMAGE                             COMMAND                CREATED             STATUS              PORTS                NAMES
1d05afdfb56f        dockerfile/elasticsearch:latest   "/elasticsearch/bin/   28 hours ago        Up 8 seconds        9200/tcp, 9300/tcp   angry_curie

コンテナの作成と起動がセットでは無く別々に行えるようになりましたので、コンテナのライフサイクルをよりきめ細やかに管理することが出来るようになります。

boot2dockerでMac OS Xのディレクトリを共有する

Docker 1.3に合わせてバージョンアップされたboot2dockerにより、コンテナとMac OS Xで簡単にディレクトリを共有できるようになりました。以下のようにオプションをつけてコンテナを起動します。

$ docker run -it -v /Users/smokeymonkey/Documents:/Documents centos /bin/bash
bash-4.2#

するとMac OS Xの"/Users/smokeymonkey/Documents"ディレクトリが、コンテナ内の"/Documents"に共有されます。

bash-4.2# ls -alF /Documents/
total 48
drwxr-xr-x  1 1000 ftp    170 Jan 23  2014 $RECYCLE.BIN/
drwxr-xr-x  1 1000 ftp    578 Oct 23  2014 ./
drwxr-xr-x 29 root root  4096 Oct 22 02:13 ../
-rw-r--r--  1 1000 ftp  18436 Oct 23  2014 .DS_Store
-rw-------  1 1000 ftp      0 Nov 13  2013 .localized

もちろんコンテナからこのディレクトリにファイルを作成すると、そのままMac OS Xで参照ができます。

bash-4.2# touch /Documents/testfile

これでコンテナとホストとなるMac OS Xでのファイルの受け渡しが簡単に出来ますし、ログファイルなどをMac OS Xで取得して解析することも出来ます。

さいごに

バージョンアップするたびに痒いところに手が届くようになってきた感がありますね!