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

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

はじめに

12/11にDocker 1.4がReleaseされました。

というかGithubではもう1.4.1になっています...

そこで、Docker 1.4のRelease NotesからNew Featuresを試してみました。

やってみた

labelオプションが追加された

Dockerデーモンにkey=value形式でラベルを割り当てることが出来ます。

以下のように--labelオプションを付与してDockerデーモンを起動します。

$ sudo /usr/bin/docker --label=[hdd=ssd] -d &

そしてdocker infoを実行すると、最終行にlabelが表示されます。

$ sudo docker -D info
Containers: 10
Images: 33
Storage Driver: devicemapper
 Pool Name: docker-202:1-279313-pool
 Pool Blocksize: 65.54 kB
 Data file: /var/lib/docker/devicemapper/devicemapper/data
 Metadata file: /var/lib/docker/devicemapper/devicemapper/metadata
 Data Space Used: 2.07 GB
 Data Space Total: 107.4 GB
 Metadata Space Used: 3.154 MB
 Metadata Space Total: 2.147 GB
 Library Version: 1.02.82-git (2013-10-04)
Execution Driver: native-0.2
Kernel Version: 3.14.20-20.44.amzn1.x86_64
Operating System: Amazon Linux AMI 2014.09
CPUs: 1
Total Memory: 996.2 MiB
Name: ip-172-31-11-227
ID: W7BC:D32Y:Z324:6NBZ:EDCQ:TNBN:XM34:PWIW:DVSK:DANE:YOGC:LZ4X
Debug mode (server): false
Debug mode (client): true
Fds: 11
Goroutines: 10
EventsListeners: 0
Init Path: /usr/bin/docker
Docker Root Dir: /var/lib/docker
Labels:
 [hdd=ssd]

オーケストレーションで複数のDockerデーモンを使う時にはわかりやすい名前を付与することができて便利なのでは無いでしょうか。

DockerfileのENVが=で書けるようになった

地味...これまでDockerfileでENVを指定する時はスペースで区切っていました。

ENV PATH $PATH:/usr/local/bin

1.4.0からは変数と値を=で結ぶことができるようになりました。

ENV PATH=$PATH:/usr/local/bin

実際に試してみましょう。以下のようなDockerfileを作成します。

$ cat Dockerfile
FROM ruby:latest
ENV EQUAL=true
ENV SPACE true

buildしてrunしてみます。

$ sudo docker build -t local/envtest .
$ sudo docker run local/envtest env
PATH=/usr/local/bundle/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
HOSTNAME=f5d5a7f7dc2d
RUBY_MAJOR=2.1
RUBY_VERSION=2.1.5
GEM_HOME=/usr/local/bundle
BUNDLE_APP_CONFIG=/usr/local/bundle
EQUAL=true
SPACE=true
HOME=/root

上記のように、=で指定した時も、スペースで指定したときも、ちゃんと環境変数が設定されています。

docker eventsでフィルターが設定できるようになった

Dockerデーモンで発生したイベントを検知するeventsでフィルターが設定できるようになりました。以下はフィルターを設定せずにeventsを実行した場合です。

$ sudo docker events

この状態で例えばcreatestartstopをしてみます。

$ sudo docker create -t -i centos bash
5cdca74ef5de259eff7d23c44b3f3042a094c375d6724dc27f92628ae967ab3f
$ sudo docker start 5cdca74ef5de
5cdca74ef5de
$ sudo docker stop 5cdca74ef5de
5cdca74ef5de

すると全イベントが検知されます。

2014-12-17T08:28:26.000000000Z 5cdca74ef5de259eff7d23c44b3f3042a094c375d6724dc27f92628ae967ab3f: (from centos:latest) create
2014-12-17T08:28:35.000000000Z 5cdca74ef5de259eff7d23c44b3f3042a094c375d6724dc27f92628ae967ab3f: (from centos:latest) start
2014-12-17T08:28:51.000000000Z 5cdca74ef5de259eff7d23c44b3f3042a094c375d6724dc27f92628ae967ab3f: (from centos:latest) die
2014-12-17T08:28:51.000000000Z 5cdca74ef5de259eff7d23c44b3f3042a094c375d6724dc27f92628ae967ab3f: (from centos:latest) stop

ではフィルターを設定し、startだけが表示されるようにします。

$ sudo docker events --filter event=start

この状態で同じようにcreatestartstopをしても、startのイベントしか出力されません。

2014-12-17T08:31:35.000000000Z 5d79087201014e29221c44d12f5320c0c43292343d44615c7c7a18c5709a6605: (from centos:latest) start

他にも'container=1d0a7b25d3aa'のようにコンテナIDを指定することも出来ます。

さいごに

今回実験的な機能として追加されたoverlayfsについてはまだ試せていませんので、近いうちにやってみたいと思います。