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

2015.02.12

ども、大瀧です。
昨日Dockerのバージョン1.5がリリースされました。いくつか追加された機能について解説と感想を書いてみます。

バージョン1.4までのアップデート記事はこちら。最近のDockerを追っかけられてなかったなぁという方におすすめです。

Boot2Dockerのバージョンアップ

MBA(OS X Yosemite) + Boot2Dockerの場合は、GitHubのリリースページからBoot2Docker-1.5.0.pkgファイルをダウンロード、実行してインストールします。その後、端末を開いて以下のコマンドを実行してBoot2Docker VMをアップグレードします。

$ boot2docker upgrade
Latest release for boot2docker/boot2docker is v1.5.0
Downloading boot2docker ISO image...
Success: downloaded https://github.com/boot2docker/boot2docker/releases/download/v1.5.0/boot2docker.iso
	to /Users/ryuta/.boot2docker/boot2docker.iso
$ boot2docker delete
$ boot2docker init
$ boot2docker up
Waiting for VM and Docker daemon to start...
......................................oooooooooooooooooooooooooooooooooo
Started.
Writing /Users/ryuta/.boot2docker/certs/boot2docker-vm/ca.pem
Writing /Users/ryuta/.boot2docker/certs/boot2docker-vm/cert.pem
Writing /Users/ryuta/.boot2docker/certs/boot2docker-vm/key.pem
Your environment variables are already set correctly.

$ docker version
Client version: 1.5.0
Client API version: 1.17
Go version (client): go1.4.1
Git commit (client): a8a31ef
OS/Arch (client): darwin/amd64
Server version: 1.5.0
Server API version: 1.17
Go version (server): go1.4.1
Git commit (server): a8a31ef
$

OKですね!

新機能を試す

コンテナのリソース監視(docker stats)

実行中のDockerコンテナのリソース使用量をtopコマンドのように表示することができます。

$ docker stats takiponecom_varnish_1 takiponecom_nginx_1 takiponecom_ghost_1
(画面が切り替わり、常時アップデートされる)
CONTAINER               CPU %               MEM USAGE/LIMIT       MEM %               NET I/O
takiponecom_ghost_1     0.11%               128.2 MiB/1.961 GiB   6.38%               39.65 KiB/823.5 KiB
takiponecom_nginx_1     0.00%               2.18 MiB/1.961 GiB    0.11%               875.7 KiB/924.5 KiB
takiponecom_varnish_1   1.21%               149.1 MiB/1.961 GiB   7.42%               148.8 KiB/144.4 KiB

これが便利に使えるのはSwarmでクラスタ組んでいるときかなと思っています。SwarmはDockerの標準APIが通るので、今回のようなDocker本体の機能追加に追随できるメリットがあるのでは。こんな感じで出せます。

$ export DOCKER_HOST=<Swarm ManagerのIPアドレス>:<Swarm Managerのポート番号>
$ docker ps
CONTAINER ID        IMAGE               COMMAND             CREATED              STATUS                  PORTS               NAMES
46010ccdcf49        ubuntu:14.04        "sleep 6000"        1 seconds ago        Up Less than a second                       ip-172-31-4-86/focused_morse
330888b05f5e        ubuntu:14.04        "sleep 6000"        2 seconds ago        Up Less than a second                       ip-172-31-4-86/adoring_wright
d8d5a2228743        ubuntu:14.04        "sleep 6000"        3 seconds ago        Up Less than a second                       ip-172-31-4-86/condescending_cori
3bd385517da4        ubuntu:14.04        "sleep 6000"        About a minute ago   Up 42 seconds                               ip-172-31-4-87/naughty_thompson
$ docker stats `docker ps -q`
CONTAINER           CPU %               MEM USAGE/LIMIT     MEM %               NET I/O
330888b05f5e        0.00%               2.121 MiB/992 MiB   0.21%               1.646 KiB/648 B
3bd385517da4        0.00%               2.121 MiB/992 MiB   0.21%               648 B/648 B
46010ccdcf49        0.00%               2.254 MiB/992 MiB   0.23%               1.326 KiB/648 B
d8d5a2228743        0.00%               2.121 MiB/992 MiB   0.21%               1.898 KiB/648 B
$

Swarmノード名とコンテナ名がStatsに載って欲しいところなので、良いやり方知っている方がいれば教えて下さい!

docker buildの-fオプション

従来、Dockerfileはファイル名が固定でdocker buildの引数に指定するディレクトリの直下に置いておくという制約がありました。今回のアップデートで、任意のファイル名とADDなどでコンテナに追加するファイルとは別のディレクトリに配置できるようになりました。アプリケーションのファイルとDockerの構成ファイルが分離できるので、「本番環境と開発環境でアプリケーションの設定を分けつつ共通のDockerfileでビルドしたい」といった小回りの効くDockerイメージの作成がやりやすくなったのではないでしょうか。かたや自分は、Dockerfileの制約に慣れてしまっているので常用することはなさそうです。

$ tree docker/
docker/
├── Dockerfile
├── LICENSE
└── README.md

0 directories, 3 files
$ docker build -t takipone/varnish2 -f docker/Dockerfile .
\Sending build context to Docker daemon 76.29 kB
Sending build context to Docker daemon
Step 0 : FROM dockerfile/ubuntu
Pulling repository dockerfile/ubuntu
e7fc98dc1b07: Download complete
511136ea3c5a: Download complete
  :
$

docker runの--read-onlyオプション

オプション名の通り、Dockerコンテナ内のボリュームを読み取り専用にします。ImmutableやStatelessなコンテナで有用かもしれませんね。-vオプションでマウントするホストボリュームは対象外で書き込みできるので、うまく使い分けたいですね。自分としては昨日書いたラズパイ環境でうまく使えるんじゃないかと、ちょっと期待しています。

$ docker run --read-only -ti -v /Users/ryuta/vomule1:/volume1 ubuntu bash
root@856ae240f57f:/# touch ./file
touch: cannot touch './file': Read-only file system
root@856ae240f57f:/# touch /volume1/file1
root@856ae240f57f:/# ls /volume1/
file1
root@856ae240f57f:/#

docker runの--pid=hostオプション

Dockerコンテナ内はホストのプロセスツリーから分離されるため、通常コンテナ内のプロセスしか確認することができません。--pid=hostオプションを付与すると、ホストのプロセス一覧にアクセスすることができます。公式ブログの通り、プロセス監視をコンテナ内から行うケースなどで有用かもしれません。

$ docker run -ti ubuntu bash root@b6f794e0f205:/# ps ax PID TTY STAT TIME COMMAND 1 ? Ss 0:00 bash 14 ? R+ 0:00 ps ax root@b6f794e0f205:/# exit $ docker run --pid=host -ti ubuntu bash root@fc4ca0609f06:/# ps ax | head PID TTY STAT TIME COMMAND 1 ? Ss 0:01 init 2 ? S 0:00 [kthreadd] 3 ? S 0:05 [ksoftirqd/0] 5 ? S< 0:00 [kworker/0:0H] 7 ? S 0:02 [rcu_sched] 8 ? S 0:00 [rcu_bh] 9 ? S 0:07 [migration/0] 10 ? S 0:00 [migration/1] 11 ? S 0:00 [ksoftirqd/1] root@fc4ca0609f06:/# ls -1 /proc | head -n 20 1 10 1022 11 112 13 14 1462 1467 15 1565 1617 1623 1643 1686 1687 1695 17 1711 1739 root@fc4ca0609f06:/# exit $ [/bash]

その他にも多数の機能拡張がありますので、興味があればCHANGELOGを見てみましょう!"Speed up docker push for images with a majority of already existing layers"というのが地味に嬉しいけど、まだ検証できていません。簡単なベンチ、誰かやってくれませんかね?(他力本願

まとめ

ざっとDocker 1.5の新機能からめぼしいものを試してみました。皆さんも新しいDockerをどんどん触っていきましょう!

参考URL