Docker Composeの公式リファレンスを読む

# はじめに
下の2つの記事によって、「Dockerをインストールして、実際にWordPressの開発環境を設定して利用する」ことができるようになりました。
[はじめてのDocker for Mac](http://qiita.com/kobori_akira/items/0cc993caeb20d77cd367)
[「DockerでWordPressサイトを開発してみよう」を読んでみよう](http://qiita.com/kobori_akira/items/ce9a4bcf737e2fee929e)

つぎは、「docker-compose」なる仕組みを理解・利用できるようにしたい。
というわけで、結局のところ一番近道であろう、公式サイトの説明を読むことにしました。

## 前提

* 上の2記事が理解できること。オリジナルのイメージを作成したことがあれば、読めるはずです。
* 筆者はDocker for Macを利用しています。
* 記事を読んだのは2017年1月。

# 概要
[こちらのサイト](https://docs.docker.com/compose/)を読んでいきます。まずはOverviewを。

## Docker Composeとは？

Docker Composeとは「**マルチコンテナのDockerアプリケーションを定義して動かす**」ことができるツール、とのこと。

たとえばこれまでだったら、WordPress用のコンテナとDB用のコンテナを用意する必要があった。このとき、繋げ方やその順番に気をつけないといけませんでした。
これをComposeファイル（yaml形式）として管理することで、一度しっかりと記述さえすれば後はコマンド一発で設定済みのたくさんのコンテナを生成・起動することができるようになります。
いろんなコンテナを乱立させるような開発案件だと便利ですね。

## 利用するための3つのステップ

Docker Composeを利用するには、次の3ステップが必要。

1. アプリケーションの環境をDockerファイルに書くこと。これでどこでも再利用できるようになります。
2. アプリケーションを作り上げるサービス（※）をdocker-compose.ymlに定義すること。これで各環境を同時に実行することができる。
※WebサーバやDBサーバなどを指しています。
3. 最後に`docker-compose up`コマンドを実行する。

## 設定ファイル（docker-compose.yml）

docker-compose.ymlは、たとえば次のように書かれる。
設定内容については、後半で再確認する。

```
version: '2'
services:
  web:
    build: .
    ports:
    - "5000:5000"
    volumes:
    - .:/code
    - logvolume01:/var/log
    links:
    - redis
  redis:
    image: redis
volumes:
  logvolume01: {}
```

ちなみに、yml形式のファイルを「YAMLファイル」と言い、さまざまなアプリケーションの設定ファイルとして利用されている。
詳しくは、[YAMLとは何か？ - いつもRailsの設定ファイルで出てくるやつの正体](http://qiita.com/Yama-to/items/587544993fb62610528a)で。

## Docker Composeのコマンド概要

Docker Composeはアプリケーションのライフサイクル（起動から終了まで）を管理するためのコマンドを持つ。

* サービスの開始、停止、再ビルド
* 実行中のサービスの状態を確認
* 実行中のサービスのログを出力
* サービス上で一回限りのコマンドを実行（？）

# 実際に動かしてみる
つぎに[Get Started](https://docs.docker.com/compose/gettingstarted/)を読みます。

## Step1 セットアップ
本文に書いてある通り、フォルダの作成、app.pyとrequirements.txtの作成を行う。ユーザディレクトリの中に作成したほうがよさそう。
ファイルの中身は気にしなくていい。

ちなみに、FlaskはRailsのPython版。Redisはメモリ上で動くKey-Value型のデータベース（初めて知りました）。
上の説明を利用すれば、2つのサービスをDocker Composeを使ってまとめる方法をこれから知ります。

## Step2 Dokcerfileを作成する
DockerイメージをbuildするDockerfileを書く。
イメージはPythonも含めたPythonアプリケーションが必要とする全ての依存性を含む。

あらためて、DockerfileとはオリジナルのDockerイメージを作るために必要なファイル。
下のソースを見るとわかりますが、下のような操作・ルールを定義づけています。

* 「python3.4-appine」というDockerイメージを土台にする
* requirements.txtに記述したFlaskとRedisをインストールする
* `python app.py`コマンドを（Dockerコンテナ作成時に）実行する

```
FROM python:3.4-alpine
ADD . /code
WORKDIR /code
RUN pip install -r requirements.txt
CMD ["python", "app.py"]
```

## Step3 Composeファイルにサービスを定義する
いよいよdocker-compose.ymlを作成する。

```
version: '2'
services:
  web:
    build: .
    ports:
     - "5000:5000"
    volumes:
     - .:/code
  redis:
    image: "redis:alpine"
```

このComposeファイルはwebサービスとredisサービスを定義している。

### webサービス
buildは、`docker build`と同じ。
さきほど作成した、カレントディレクトリ上のDockerfileを元にビルドすることがわかる。

portsは`docker run -p`と同じ。
ポートフォワーディングの設定をし、ローカルの5000番にアクセスがあったらwebサービス（Flask）の5000番に飛ばす。

volumesは、`docker run -v`と同じ。
カレントディレクトリとコンテナ上のcodeフォルダを共有。

### redisサービス
image は、`docker run (イメージ名)`と同じ。
今回はオリジナルのイメージを使う必要がなかったので、Docker Hubに登録されている公式のRedisのDockerイメージを利用する。

## Step4 Docker Composeを利用してアプリケーションをビルド・起動する
`docker-compose up`コマンドを実行。
`up`コマンドで、コンテナの作成と起動をまとめて行う。
キャッシュも無いため、最初はちょっと時間がかかるはず。

実行が完了したら、[http://0.0.0.0:5000/](http://0.0.0.0:5000/)または[http://localhost:5000](http://localhost:5000)にアクセス。
「Hello World! I have been seen 1 times.」と出れば成功。ページを更新すると「2 times.」のように数値が増加していく。

## Step5 アプリケーションをアップデートする
docker-compose.ymlで記述したように、app.pyはコンテナのcodeフォルダと共有されている。
そのためローカルのソースを修正すれば、コンテナのソースも修正されたことになる。

ためしに、app.pyの10行目を「Hello World!」から「Hello from Docker!」に修正してみる。
ブラウザで変更が確認できれば成功。

## Step6 その他のコマンドを試してみる
ここまで実行できれば、Docker Composeの概要はわかった。
あとは、更にいろいろなことが出来るようにコマンドの勉強をする。

* `docker-compose up -d`で、デタッチドモード（バックグラウンドでの実行）になる。
* もし上のコマンドで実行した場合は、サービスを停止するためには`docker-compose stop`コマンドを打つ。
* `docker-compose ps`で、実行中のサービスが一覧できる。
* `docker-compose run`で、サービスの中に入ってコマンドを実行することができる。
たとえば`docker-compose run web env`は、webサービス（コンテナ）上でenvコマンド（環境変数の一覧を表示）を実行することになる。
* もし全て（のサービス）を停止させたい場合は、`docker-compose down`を実行する。`--volumes`オプションをつけると、Redisが使用していたデータも削除してくれる。

# 最後に
これで、Docker Composeも利用できるようになったはず。
せっかくなら、[「DockerでWordPressサイトを開発してみよう」を読んでみよう](http://qiita.com/kobori_akira/items/ce9a4bcf737e2fee929e)で覚えたWordPressのDocker構築をDocker Composeでやってみます。これは次のエントリで。