fig/docker-compose事始め

fig/docker-compose初心者なので、環境構築、超簡単なdocker-compose.yml、docker-compose xxのコマンドライン辺りを半年後の自分用にチラシの裏しておきます。なお、figはdockerへ統合された事に伴い、docker-composeと名前が変わっています。ここでは(タイトルを除いて)docker-composeで統一します。


# docker-compose環境をEC2にsetupする
Amazon EC2 + Ubuntu14.04でのsetup手順です(docker-composeの最新verのinstallコマンドは[随時ここを参照](https://docs.docker.com/compose/install/)してください。以下は(現時点の最新の)Ver1.3.3の場合のCommandになります

```
まずはDocker (>v1.3)をいれる
#apt-get update
#wget -qO- https://get.docker.com/ | sh
#apt-get -y install sysv-rc-conf
#sysv-rc-conf docker on

続いて、docker-compose v1.3.3をいれる (curl経由)
#curl -L https://github.com/docker/compose/releases/download/1.3.3/docker-compose-`uname -s`-`uname -m` > /usr/local/bin/docker-compose
#chmod +x /usr/local/bin/docker-compose

#docker-compose --version
で、1.3.3と表示される事を確認
```

なお、[Mac等ではcurlでいれると実行時にErrorで動かないケースがあるみたいで](https://github.com/docker/fig/issues/271)、その場合はpythonのpip経由でsetupすると動くみたいです。

```
#apt-get install python-pip
#pip --version
#pip install -U docker-compose
#docker-compose --version
```


# nodeとmongoのcontainerを立ち上げる
まずはdocker-compose.ymlというファイルを作ります。

* `node`と`mongo`と言うserviceが定義されます (なおservice名は英数字のみ、`_`とか`-`は使えない)。  
それぞれ、`./node_test`と`./mongo_test`以下のDockerfileからcontainerが作成されます。
* `node` serviceから`mongo` serviceを参照するので、`node`側にlinksの設定をします

``` docker-compose.yml
node:
  build: ./node_test
  ports:
   - "25525:80"
  links:
   - mongo
mongo:
  build: ./mongo_test
  ports:
   - "27017:27017"
```

この状態で、`docker-compose up`を実行すると、containerの作成と起動がされるはず！
`docker-compose up -d`でbackgroundでdocker-composeを動かしてくれます。



# docker-compose.ymlのoption
[本家docker-compose.ymlの説明](https://github.com/docker/fig/blob/master/docs/yml.md)がモトネタです。

| Option名| 意味|
|:-----------|:----|
| web | 任意の名前 |
| build | Dockerfile のpath |
| image | Dockerのimage IDもしくはTag。既に完成済のimageを使うか、imageをnetwork経由で持ってくる場合|
| links| 別のContainerを参照する場合に使う、`docker run --link`に相当 |
| external_links|docker-compose.ymlに書かれて無い別containerを参照する場合に使う, docker-compose v1.1の新機能 |
| ports | Host側にPortをbindする場合に使う、`docker run -p`に相当、exposeとの使い分けに注意|
| expose | Host側にPortをbindせずに別containerと通信する場合に使う、portsとの使い分けに注意|
| volumes | host linuxのdirectoryをcontainer側にmountする場合に使う、`docker run -v`に相当 |
| command | DockerfileのCMDを上書きしてする場合に使う |
| environment | container内での環境変数を追加設定する |

# docker-composeコマンドのoption
[本家docker-composeのコマンドラインオプション](https://github.com/docker/fig/blob/master/docs/cli.md)が元ネタです。

### docker-compose up
docker-compose.ymlを探してそこにに書かれた内容から、containerの再構築/起動/Linkを行う。

* `docker-compose up -d`とすると、backgroundでdocker-composeが動く
* `docker-compose up --no-recreate`とすると、containerの停止/再構築がされず、停止状態のcontainerの起動から始まる

### docker-compose ps
`docker ps`と同じで、containerの状態をdumpしてくれる

### docker-compose logs
個々のcontainerの標準出力が纏められて出力される。

### docker-compose run
主に問題解析用のcommandか。本家では、Run a one-off command on a serviceと書かれて居る。



* `docker-compose run node`  
 docker-compose.ymlの中で、`node`で設定されたserviceと、そこからlinksで指定されたservivce達が立ち上がる
* `docker-compose run node /bin/sh`  
 `node`のDockerfileの`CMD`の内容は実行されず、`node`serviceのcontainerのshell状態で立ち上がる
* `docker-compose run --service-ports node /bin/sh`  
 docker-compose.ymlのportsの設定が有効な状態でcontainerのshell状態で立ち上がる
* `docker-compose run node cat /etc/hosts`  
 `node` serviceの`/etc/hosts`をdump, linkしているcontainerのhost名の確認ができる
* `docker-compose run --no-deps node cat /etc/hosts`  
 `--no-deps`を加えると、linksで指定されたserviceが起動しない状態で`node` serviceのcontainerを起動
* `docker-compose run node env`  
 `env`を加えると、`node`で設定されたserviceの環境変数がDumpされる
 
注意点

* `--service-ports` のoptionが無いと、docker-compose.ymlの`ports`の設定が無効状態でContainer起動するので注意。
* `docker run xx`で起動した場合、環境変数は設定されて居ない状態でContainerが立ち上がります。docker-compose.ymlの`environment`で設定した内容も、`links`で設定した別Containerの内容も設定されません。containerのshellで`export xx=yy`などで個別に設定してあげる必要があります (何か上手い回避策があれば教えてください)。


### docker-compose build
docker-compose.ymlから参照されているdocker imageを作り直します。Dockerfile等を書き直した時には、作りなおしが必要です。

なお、`--no-cache`のOptionは動かないみたいなので、cache無しで0から作り直したい場合には、`docker build --no-cache`を実行する必要が有ります。


# 為になるLink

* [本家docker-compose.ymlの説明](https://github.com/docker/fig/blob/master/docs/yml.md)
* [本家docker-composeのコマンドラインオプション](https://github.com/docker/fig/blob/master/docs/cli.md)
* [Touch the fig(1)](http://qiita.com/inokappa/items/eac7e62b4429304fc047)
* [docker-compose v1.1の新機能, 以下の2つが大きい機能追加かな](https://github.com/docker/fig/releases/tag/1.1.0-rc1)
 * `external_links` 自分のdocker-compose.ymlに書かれて居ないdocker containerとlinkできる
 * `env_file` 環境変数を記述して置ける。`docker run --env-file`がdocker-compose上でもできる