Docker 1.5の変更点

Docker 1.5が出た.IPv6のサポートやstatsコマンドによるコンテナのメトリクス表示などが追加された.ユーザ的に一番嬉しいのはDockerfileの名前を自由に決められるようになったことだろうと思う.

今までDockerfileはDockefileという名前しか受け付けなかった,というかまともに動かなかった.やりようはあって,標準入力からぶっ込むことはできた.例えばbaseとう名前のDockerfileを作って以下のようにbuildを実行することができた.

$ docker build -t tcnksm/test - < base

しかし,ADDもしくはCOPYインストラクションを使っている場合に,そのソースはURLでないといけないという制限があった.ソースにローカルのファイルを指定していると,buildのコンテキストが伝わらずno such file or directoryエラーが発生するという面白い状況だった.

1.5からは-fオプションが追加され,Dockerfileという名前以外のDockerfileを指定することができるようになった.

$ docker build -t tcnksm/test -f base .

ADDCOPYインストラクションのソースにローカルファイルを指定していてもちゃんと動く.

しかし,今までのようにカレントディレクトリのDockerfileをビルドすることに慣れていると,ハマるところがある.カレントディレクトリ以外のDockerfileをビルドするときは,そのbuildの起点となるディレクトリをちゃんと指定する必要がある.例えば,filesディレクトリ内のbaseという名前のDocekerfileをその外からビルドするときは,以下のようにする.

$ docker build -t tcnksm/test -f files/base files

末尾のfilesをいつも通りに.にするとADDCOPYインストラクションでno such file or directoryエラーが発生する.

DockerHub

ではDockerHubのAutomated buildはどうか.現時点(2015年2月11日)ではDockerfileという名前以外は受け付けていない.ので,今まで通りにディレクトリごとにDockerifileを準備する必要がある.

ただ,自分はディレクトリごとにDockerfileを分けるという慣習には適応しすぎているので,もうこのままでも良いかなって気持ちはある…

その他の変更

他にもいくつか自分的に気になった機能をいくつか.

Read-onlyコンテナ

run--read-onlyオプションがつき,コンテナのファイルシステムを書き込み不可にすることができるようになった.

$ docker run --read-only busybox sh -c 'echo test > /etc/test.conf'
sh: can't create /etc/test.conf: Read-only file system

この場合,書き込みはvolume領域のみに行える.

$ docker run --read-only -v `pwd`/volume:/volume busybox sh -c 'echo test > /volume/test.conf'

これはセキュリティとコンテナのステートレスの推進が目的だと思う.

Stats

statsコマンドが追加され,リアルタイムでコンテナのCPUやメモリ,ネットワークI/Oなどを確認できるようになった.

$ docker run -d --name redis -p 6379 crosbymichael/redis
$ docker stats redis
# CONTAINER           CPU %               MEM USAGE/LIMIT       MEM %               NET I/O
# redis               0.46%               10.23 MiB/1.961 GiB   0.51%               1.266 KiB/648 B

ざっと確認するには使える.ただ,メトリクス収集をまともにやるならgoogle/cadvisorの方が筋が良いのでこっち使うと思う.

ホストのPID

--net=hostのように--pid=hostを指定するとするとホストのPIDのnamespaceが使われるようになる.

$ docker run --pid=host busybox ps

Dockerイメージのスペック

またリリースアナウンスには,Dockerイメージのスペックを作り始めたことが触れられている.

これはCoreOS/RocketApp Containerの登場の影響によるものだと推測できる.その辺については次回詳しく書く.