Docker Compose 1.5 について

 Docker
2015.11.05

Announcing Docker 1.9: Production-ready Swarm and Multi-host Networking | Docker Blog ということで、Docker 1.9 と関連製品が同時にリリースされました。

 

Docker ToolBox のインストール、またはその再インストールで
Dockerはもちろん、Docker Compose、Docker Machineも最新版が使えるようになります。
(再インストールした場合、以下の実行が必要になるかもしれません
 docker-machine regenerate-certs default

 
Docker Compose 1.5 の更新は以下の通りです。

 
ということで、以下いくつかの特徴をみていきます。
(原文はこちらから確認いただけます)
 
 

1. 環境変数

 
こんな感じで使えます。

monit:
  image: pottava/docker-webui
  ports:
    - "9000:9000"
  volumes:
    - "${DOCKER_CERT_PATH}:/etc/docker-compose/cert"
  environment:
    - DOCKER_HOST
    - DOCKER_CERT_PATH=/etc/docker-compose/cert
    - APP_LABEL_OVERRIDE_NAMES=com.docker.compose.service
    - APP_LABEL_FILTERS=com.docker.compose.service
    - APP_HIDDEN_CONTAINERS=monit

Composeファイルでは environment としてコンテナ内部に渡したい環境変数を指示しますが
例では DOCKER_HOST には値が指定されていません。この場合 docker-compose up した
ホスト上の環境変数が引き継がれます。
また volumes の中でも ${DOCKER_CERT_PATH} が使われていますが
このようにして、ホスト上の環境変数を参照できます。
 
社内でも AWSの AccessKeyや SecretKeyをわたしたいことがありましたが
これでバージョン管理システムにそれらの秘密情報をコミットせずに済みます。
 
 

2. Composeファイルの上書き

 
2つの Composeファイルを使ってみましょう。
まずは基本的な動作を指定した、ベースとなる Composeファイルです。
 
docker-compose.yml

web:
  image: example/my_app:1.2
  links:
    - db

db:
  image: postgres

続いて開発環境用に、ソースコードは直接マウントし、Dockerイメージも
ローカルでビルドするような Composeファイルを用意します。
名前は先ほどのものに .overrides をつけています。
 
docker-compose.overrides.yml

web:
  build: .
  volumes:
    - './code:/code'
  ports:
    - 8080:80
  environment:
    DEBUG: 'true'

db:
  command: '-d'
  ports:
    - 5432:5432

これらがあるフォルダで docker-compse up すると、
docker-compose.ymlは docker-compose.overrides.ymlに上書きされて起動します。
docker-compose.overrides.yml というファイルがあれば規約で上書くようです。
 
では本番環境用のファイルも用意してみます。
 
docker-compose.prod.yml

web:
  ports:
    - 80:80
  environment:
    PRODUCTION: 'true'

Composeファイルの命名規則に縛られたくない場合は、以下のように起動します。
docker-compose -f docker-compose.yml -f docker-compose.prod.yml up -d
 
ユースケースとしてもうひとつ。
 
docker-compose.admin.yml

dbadmin:
  build: database_admin/
  links:
    - db

こんな Composeファイルがあるとして、以下のような run コマンドを実行すれば
docker-compose -f docker-compose.yml -f docker-compose.admin.yml run dbadmin db-backup
データベースのエクスポートやバックアップも簡単ですね!
 
 

3. 新しいネットワーク機能の利用

 
2の例でも使っていた links オプションですが、これが不要になる話です。
こんな docker-compose.yml ファイルがあるとして
 
docker-compose.yml

web:
  build: .
  ports:
    - "8000:8000"
db:
  image: postgres

そこで
docker-compose --x-networking up
こんなコマンドでアプリを起動すると、以下のようなことが起こります。

  1. myapp という名前のネットワークが作られます
  2. webコンテナが立ち上がり、myappネットワークに myapp_web_1 という名前で参加します
  3. dbコンテナが立ち上がり、myappネットワークに myapp_db_1 という名前で参加します

それぞれのコンテナは、myapp_web_1や myapp_db_1という名前で
それぞれの IPアドレスに解決されます。なので、Webサービスは
 
postgres://myapp_db_1:5432
 
でデータベースに接続できることになります。
 
 
サービスを更新する場合はこれまでのように
docker-compose up を使うことができ、古いコンテナは削除され
先ほどの名前は新しいコンテナの IPアドレスに解決されるようになります。
 
もしいずれかのコンテナから旧コンテナへの接続が開いていたら closeされますが
それを検知し、再度ルックアップ & 接続を行うかどうかはアプリ側の責務になります。
 
 
上述のように、通常各サービスはコンテナ名でネットワークに公開されますが、
もし名前を変えたければ container_name オプションが使えます。

web:
  build: .
  container_name: "my-web-application"

というわけで、もう links オプションは deprecatedでもいいかも、と
公式ブログには書かれています。多くの場合、もう docker-compose.yml
からも linksは外してしまってもいいかも、と。
 
 
ちなみに以前からある net オプションですが、これを指定すると
そのコンテナはこのアプリケーションのネットワークに参加せず、
他のサービスとの通信ができなくなります。
さらに、すべてのコンテナが net オプションを指定すると
ネットワークそのものが作られないようです。
 
 
最後に、ネットワークドライバを変更できるという話があり、
期待している方も多いであろう overlay ネットワークがついに!
ですが原文では TODO になっているので・・
コマンドだけ載せて今回は終わりにしたいと思います。
 
docker-compose --x-networking --x-network-driver=overlay up