周回遅れのDocker 3: Docker Compose を使う


## 2015-08-17 追記

Docker Toolbox を利用した環境構築をベースにしたものへ説明文を変更。

----


[前回](http://qiita.com/kumatch/items/7ea3bd4f87237980a399) で作成して稼働させた Nginx + PHP-FPM の 2 コンテナ構成のものをベースにして、複数の Docker コンテナを稼働させるための定義ファイルを記述してビルドから起動までを解決してくれる [Docker Compose](https://www.docker.com/docker-compose) を使って行うようにしてみる。Docker Compose は[初回](http://qiita.com/kumatch/items/1aa40f25c82b2b88815b) にて導入した Docker Toolbox に同梱されているため、すぐに利用することができる。


念のため前回構築したコンテナは完全に消しておくことにする。

```bash
$ docker ps -a
CONTAINER ID        IMAGE                    COMMAND                CREATED             STATUS                     PORTS               NAMES
e8a253038295        sandbox-phpinfo-nginx    "nginx -g 'daemon of   10 hours ago        Exited (0) 10 seconds ago                       nginx
0be18a7d222f        sandbox-phpinfo-phpfpm   "php-fpm"              10 hours ago        Exited (0) 10 seconds ago                       phpfpm

$ docker rm nginx phpfpm
```



## Docker Compose の定義ファイル

Docker Composeの定義ファイルとして `docker-compose.yml` を作成。ここでは前回に docker の build や run の際に指定していたオプションの内容などを、決められた定義ファイルパラメータとして記述する。

今回用意した定義ファイルは以下のとおり、コンテナに対してそのイメージを構築するためのポインタをはじめとして、前回オプションとして指定していたポートマッピングとコンテナ間連携のリンク設定値を記述している。

```yaml:docker-compose.yml
web:
  build: nginx
  ports:
    - 80:80
  links:
    - app:php

app:
  build: phpfpm
```

### 動作確認

`docker-compose up` コマンドで、コンテナ作成と起動までを一発で行う。必要ならばコンテナのイメージ作成も最初にやってくれる。


```bash
$ docker-compose up -d

Building app...
Step 0 : FROM php:fpm
 ---> 1f4ac3cf4d04
Step 1 : COPY index.php /var/www/html/
 ---> 6f909ff1d867
Removing intermediate container 6fee3f3511fe
Step 2 : CMD php-fpm
 ---> Running in 7a5f58164968
 ---> 346b2956c9c4
Removing intermediate container 7a5f58164968
Successfully built 346b2956c9c4
Creating sandboxdockerphpinfonginxphpfpm_app_1...
Building web...
Step 0 : FROM nginx
 ---> 319d2015d149
Step 1 : ADD server.conf /etc/nginx/conf.d/server.conf
 ---> 5f7943757e76
Removing intermediate container 9430dab8601e
Successfully built 5f7943757e76
Creating sandboxdockerphpinfonginxphpfpm_web_1...
```

docker のイメージ作成とコンテナ起動と構成までのすべてが一発で完了している。

```bash
$ docker ps
CONTAINER ID        IMAGE                                 COMMAND                CREATED             STATUS              PORTS                         NAMES
db3090a2f4ae        sandboxdockerphpinfonginxphpfpm_web   "nginx -g 'daemon of   2 minutes ago       Up 2 minutes        0.0.0.0:80->80/tcp, 443/tcp   sandboxdockerphpinfonginxphpfpm_web_1
0a84b1c0323d        sandboxdockerphpinfonginxphpfpm_app   "php-fpm"              2 minutes ago       Up 2 minutes        9000/tcp                      sandboxdockerphpinfonginxphpfpm_app_1
```

同等の内容は `docker-compose ps` の方でも確認することができる。


```bash
$ docker-compose ps

                Name                          Command          State              Ports
--------------------------------------------------------------------------------------------------
sandboxdockerphpinfonginxphpfpm_app_1   php-fpm                Up      9000/tcp
sandboxdockerphpinfonginxphpfpm_web_1   nginx -g daemon off;   Up      443/tcp, 0.0.0.0:80->80/tcp
```


ブラウザでアクセスすると、きちんと PHP-FPM による phpinfo() が表示される。（前回の内容と一緒。）


`docker-compose start`, `docker-compose stop` コマンドで管理下にある全コンテナをまとめて起動、停止できる。サービスとして up, down する目的であればいちいち１つずつ docker コマンドを使う必要はない。また明示的に指定すればそれだけを start, stop することもできる。


```bash
$ docker-compose start
$ docker-compose stop
```

`docker-compose rm` コマンドで、停止したコンテナを対象にしたコンテナ削除処理が行える。ちゃんと問い合わせが１つ挟まっているし、停止していないコンテナの場合は削除処理自体一切行われないので安心。

```bash
$ docker-compose rm

Going to remove sandboxdockerphpinfonginxphpfpm_web_1, sandboxdockerphpinfonginxphpfpm_app_1
Are you sure? [yN] y
Removing sandboxdockerphpinfonginxphpfpm_app_1...
Removing sandboxdockerphpinfonginxphpfpm_web_1...
```


## サンプルソース

今回利用したサンプルソース。

* [Nginx + PHP-FPM](https://github.com/kumatch/sandbox-docker-phpinfo-nginx-phpfpm/tree/1.1.0)