Docker Compose リファレンス


## 概要
[2014年末の DockerCon EUで発表された公式のオーケストレーションツール Machine, Swarm, Compose](http://blog.docker.com/2014/12/announcing-docker-machine-swarm-and-compose-for-orchestrating-distributed-apps/) のうち **Compose** についてのまとめ。
2015年02月26日にダウンロード可能な最初のバージョンが出た

Compose を一言で説明するならば、複数のサービス（コンテナ）からなるアプリケーションを管理できるツール。

Machine, Swarm については以下参照

* [Docker Machine リファレンス](http://qiita.com/spesnova/items/073dd64a8a1d580d9ae9)
* [Docker Swarm リファレンス](http://qiita.com/spesnova/items/f4b5f7ee57c9271c9dbd)

## Compose とは
Compose は複数の要素からなるアプリケーション、つまり複数のコンテナからなるアプリケーションを 1 つの YAML ファイルに定義し、1 つのコマンドラインでアプリケーションの起動や管理ができるツール。

（1 つ 1 つの要素を "サービス" 、そのサービスが組み合わさって動くのが "アプリケーション" と呼ぶことにする。）

Compose ができること

* 各サービスのスタート・ストップ・リビルド
* 動いているサービスのステータス確認
* 動いているサービスのログのストリーミング
* one-off コンテナの実行

大まかに 3 つのステップで使う。

0. アプリケーションの各要素の環境を `Dockerfile` に定義する
0. その各要素をどう動かし、どう協調させたいかを `docker-compose.yml` に定義する
0. `docker-compose up` コマンドでアプリケーションを起動する

## インストール
### OSX x86_64
[GitHub リポジトリの releases](https://github.com/docker/compose/releases) から OSX x86_64 用のバイナリをダウンロードする。

例: https://github.com/docker/compose/releases/download/1.2.0/docker-compose-Darwin-x86_64

```bash

$ COMPOSE_VERSION=1.2.0
$ curl -L https://github.com/docker/compose/releases/download/$COMPOSE_VERSION/docker-compose-`uname -s`-`uname -m` > /usr/local/bin/docker-compose
$ chmod +x /usr/local/bin/docker-compose
```

### Linux x86_64
[GitHub リポジトリの releases](https://github.com/docker/compose/releases) から Linux x86_64 用のバイナリをダウンロードする。

例: https://github.com/docker/compose/releases/download/1.2.0/docker-compose-Linux-x86_64

```bash
$ COMPOSE_VERSION=1.2.0
$ curl -L https://github.com/docker/compose/releases/download/$COMPOSE_VERSION/docker-compose-`uname -s`-`uname -m` > /usr/local/bin/docker-compose
$ chmod +x /usr/local/bin/docker-compose
```

#### CoreOS
CoreOS は `/usr` は Read-Only な領域なので、`/opt` 以下にコマンドを置く。

```bash
$ COMPOSE_VERSION=1.2.0
$ curl -L https://github.com/docker/compose/releases/download/$COMPOSE_VERSION/docker-compose-`uname -s`-`uname -m` > ~/docker-compose
$ sudo mkdir /opt/bin
$ sudo mv ~/docker-compose /opt/bin/docker-compose
$ sudo chown root:root /opt/bin/docker-compose
$ sudo chmod +x /opt/bin/docker-compose
```

## Hello World
[Docker Compose を使って Sinatra と Redis コンテナを 1 コマンドで立ち上げる](http://qiita.com/spesnova/items/40b49b9faa5faa1f98bf)

## [WIP] Compose コマンドリファレンス
## [WIP] docker-compose.yml リファレンス
## [WIP] 環境変数リファレンス
LINK 機能を使ってリンクしたコンテナの接続情報を環境変数を使って受け取るのはもう推奨ではないもよう。その代わりリンクしたサービスの "名前" で `/etc/hosts` に追記してくれている。

## Compose の設定
### `COMPOSE_PROJECT_NAME`
プロジェクト名の設定。デフォルトでは YAML ファイルのあるディレクトリの `basename` になる。

```bash
$ export COMPOSE_PROJECT_NAME=hello_world
```

### `COMPOSE_FILE`
YAML ファイルのパス。デフォルトはカレントディレクトリの `docker-compose.yml` 

```bash
$ export COMPOSE_FILE=docker-compose.production.yml
```

### `DOCKER_HOST`
docker CLI と同じく docker デーモンの URL を指定できる。デフォルトは `unix:///var/run/docker.sock`

```bash
$ export DOCKER_HOST=tcp://172.17.8.101:2375
```

## Compose コマンドの補完
#### OSX 
bash-completion のインストール

```bash
# for OSX
$ brew install bash-completion

# for RedHat, CentOS, Fedora
$ yum install bash-completion

# for Debian, Ubuntu
$ apt-get install bash-completion

# [TODO] for CoreOS
```

`compose` 用の補完ファイルのインストール

```
# for OSX
$ curl -L https://raw.githubusercontent.com/docker/compose/1.1.0/contrib/completion/bash/docker-compose > /usr/local/etc/bash_completion.d/docker-compose

# for Linux
$ curl -L https://raw.githubusercontent.com/docker/compose/1.1.0/contrib/completion/bash/docker-compose > /etc/bash_completion.d/docker-compose
```

これで `docker-compose` コマンドの補完が利く

```bash
$ docker-compose
build    help     kill     logs     port     ps       pull     restart  rm       run      scale    start    stop     up
```

## Swarm 連携
[Swarm と組み合わせて Compose(Fig) をマルチホスト環境で使う](http://qiita.com/spesnova/items/bd64b84368370391eb0c)


## REF

* [docker/compose](https://github.com/docker/compose)
 * [Change Log](https://github.com/docker/compose/blob/master/CHANGES.md)
 * [Roadmap](https://github.com/docker/compose/blob/master/ROADMAP.md)
* [公式ドキュメント](https://docs.docker.com/compose/)
 * [インストール](https://docs.docker.com/compose/install/)
 * [コマンドラインリファレンス](https://docs.docker.com/compose/cli/)
 * [YAMLファイルリファレンス](https://docs.docker.com/compose/yml/)
 * [環境変数](https://docs.docker.com/compose/env/)
 * [コマンド補完](https://docs.docker.com/compose/completion/)
* [ANNOUNCING DOCKER COMPOSE](http://blog.docker.com/2015/02/announcing-docker-compose/)
* [Fig](http://www.fig.sh/)