Docker 1.6の変更点まとめ

2015年4月16日にDocker 1.6がリリースされました。Docker本体のみならず、Docker社が面倒を見ている各種周辺ツールも一斉にタグがうたれています。Docker社のBlog記事から要点をまとめます。

本題に入る前に、今のDockerファミリーのソフトウェアたちを列挙しておきます。

 * Docker Engine: Dockerコンテナを動作させるエンジン
 * Docker Registry: Dockerコンテナイメージを保持するサービス
 * Docker Compose: Dockerオーケストレータ
 * Docker Swarm: 複数Dockerホストを抽象化
 * Docker Machine: Dockerホストを様々な環境に作成・管理する

参照元のDocker社のBlog記事はこちら

* [Docker 1.6: Engine & Orchestration Updates, Registry 2.0, & Windows Client Preview | Docker Blog](http://blog.docker.com/2015/04/docker-release-1-6/)

* [Faster and Better Image Distribution with Registry 2.0 and Engine 1.6 | Docker Blog](http://blog.docker.com/2015/04/faster-and-better-image-distribution-with-registry-2-0-and-engine-1-6/)

* [Easily Configure Apps for Multiple Environments with Compose 1.2 and Much More | Docker Blog](http://blog.docker.com/2015/04/easily-configure-apps-for-multiple-environments-with-compose-1-2-and-much-more/)



## Docker Engine 1.6

### Container and Image Labels
コンテナとイメージにユーザ定義のラベルを付与できるようになりました。ちょっと誤解しがちなのは、AWSやOpenStackでのユーザ定義メタデータ(仮想マシンを起動するときにメタデータを与えて、起動した内部プロセスから参照する)相当は、Dockerの世界では起動時に与える環境変数で取り扱っています。今回の新機能であるラベルは、コンテナの中から参照するものではなく、DockerイメージやDockerコンテナを探しやすくするためのものです。

> Adding Label Support to Docker 1.6 - by Darren Shepherd on April 16, 2015
> http://rancher.com/docker-labels/
> If you understand how environment variables work in Docker, you will see that container labels function very much the same way.  Labels are similar to environment variables in that they are key value pairs attached to an image or a container.  Labels are different from environment variable in that they are not visible to the running application and they can also be used for fast look-up of images and containers.
> 
```
# Dockerfileでのコンテナイメージのラベル付与
FROM busybox
LABEL com.example.foo=bar
# コンテナイメージのラベル検索
docker images -f label=com.example.foo=bar
# コンテナ起動時のラベル付与
docker run --name test2 -l com.example.bar=baz test echo hi
# 稼働中コンテナのラベル検索
docker ps -a -f label=com.example.bar=baz
```

### Windows Client Preview
Windows環境のネイティブDockerクライアント。要するにdocker.exeというコマンドラインツールです。

「Windowsサポート」と短絡的に拡大解釈されがちですが、WindowsアプリがDockerコンテナ内で動作するわけなく(まぁ、Monoとかあるけれど、そういうイミジャナイ)、あくまでもWindows用のコマンドラインツールです。

### Content Addressable Image Identifiers
これまでは```docker pull```や```docker run```するときに与えるイメージで、特定のタグを指定することができました(```docker run <namespace>/<repository>:<tag>```)。タグの代わりに、特定のコミットハッシュ(digest)を指定できるようになりました。コミットハッシュは```@```で指定します。

```docker run <namespace>/<repository>@321cb718```

### Logging Drivers
コンテナのログ機構がプラガブルに指定できるように。具体的には、```docker run```に```--log-driver```オプションが追加されました。いま取れる値は以下の3種類。

 * ```json-file``` (default)
 * ```syslog```
 * ```none```

### ‒‒cgroup-parent
これまではコンテナ起動時に特定のnamespacesとcapabilitiesを指定することができましたが、cgroupsはできていませんでした。これができるようになりました。

### Ulimits
Dockerデーモンのulimitを単純に継承するのではなく、各コンテナのulimitの値を起動時に個別に指定したり、デフォルトのulimitの値を指定したりできるようになりました。

```
# httpdコンテナをプロセス数のソフトリミット2048, ハードリミット4096で起動する
docker run -d --ulimit nproc=2048:4096 httpd
# コンテナのデフォルトのulimitを指定する
docker --default-ulimit -d nproc=1024:2048
```

### Dockerfile instructions can now be used when committing and importing
```docker commit```に```--change```オプションが追加されました。Dockerfileに使えるコマンド(```CMD```とか```EXPOSE```とか)を指定することで、特定のDockerfileコマンドを実行してコンテナイメージをコミットできるようになりました。Dockerfileを書きなおして全体を```docker build```し直す必要がなくなりました。

## Registry 2.0
Dockerコンテナイメージを管理するリポジトリをつくるのがDocker Registryです。[Docker Hub](https://hub.docker.com/)も根幹はDocker Registryで動作しています。

Docker Registryが2.0になりました。性能改善のほか、Webhoookで通知を送る機能(コンテナイメージがpushされたらCIを走らせたり、チャットに書き込んだり)、Native TLSサポート、など。

より詳しいChangeLogは[こちら](https://github.com/docker/distribution/releases/tag/v2.0.0)
ちなみに、Registryという名前ですが、GitHub上でのリポジトリ名はdistributionになっています。

## Compose 1.2
複数の依存関係のあるDockerコンテナで構成したサービス群をオーケストレートするのがDocker Compose (旧名Fig)です。サービス群をymlファイルに書いて、Docker Composeに食わせれば、そのとおりにコンテナをよろしく起動してくれる代物。

Docker Composeが1.2になりました。共通的な構成情報を継承して、構成情報の抽象化、再利用がより容易になりました。

より詳しいChangeLogは[こちら](https://github.com/docker/compose/releases/tag/1.2.0
)

## Swarm 0.2 
複数台のDockerホストをクラスタリングするのがDocker Swarmです。複数台のDockerホストプールをあたかも1台のDockerホストのように仮想的に見せることができます。

新たなスケジューリング戦略の導入、サポートするDockerコマンドセットの拡充、プラガブルなクラスタリングドライバの導入、といった点が変更点に挙げられています。

## Machine 0.2

Dockerホストを各種IaaSや仮想化環境に作成し管理するのがDocker Machineです。IaaSや仮想化環境はProviderという呼び名で管理されますが、Providerインタフェースの改善により、新たなProviderの開発が用意になりました。ほか、信頼性の向上など。

より詳しいChangeLogは[こちら](https://github.com/docker/machine/releases/tag/v0.2.0)