Dockerコンテナの定義、実行の自動化

docker-composeを使うと、複数コンテナの構成をコードで定義でき
実行することができます。

docker-swarmと合わせて使う事で、
複数ホスト間でのスケールイン/スケールアウトが簡単になります。

## 1. 実行環境
* OS: Max OSX

## 2. 必要ソフトウェア
* docker
* docker-compose
* docker-machine
* docker-swarm
* virtualbox

全てbrewからインストールできます。

```bash
$ brew search docker                             
boot2docker           docker-machine (installed)        homebrew/versions/boot2docker141  homebrew/versions/docker141   homebrew/versions/docker171
docker (installed)        docker-swarm (installed)      homebrew/versions/boot2docker162  homebrew/versions/docker150
docker-compose (installed)    homebrew/versions/boot2docker133  homebrew/versions/docker133       homebrew/versions/docker162
homebrew/completions/boot2docker-completion    homebrew/emacs/dockerfile-mode             Caskroom/cask/docker-compose           Caskroom/cask/docker
homebrew/completions/docker-completion         Caskroom/cask/boot2docker-status           Caskroom/cask/docker-machine-driver-parallels  Caskroom/cask/dockertoolbox
homebrew/completions/docker-machine-completion     Caskroom/cask/boot2docker                  Caskroom/cask/docker-machine

$ brew cask search virtualbox 
==> Exact match
virtualbox
==> Partial matches
virtualbox-extension-pack
```

## 3. Swarmでコンテナのクラスタリング
[Dockerコンテナをクラスタリングする](http://qiita.com/hikouki/items/05e408061203a72aef8f)を参照下さい。

## 4. docker-compose.ymlを作成
docker-compose.ymlでコンテナの構成を定義します。

* docker-compose.yml

```docker-compose.yml
web:
  image: tutum/hello-world
  ports:
    - 80:80
redis:
  image: redis:latest
```

## 5. コンテナを起動する
以下のコマンドで、docker-compose.yml通りにコンテナが構築されます。

```bash
$ docker-compose up -d

$ docker ps
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                       NAMES
ac93efeba148        redis:latest        "/entrypoint.sh redis"   7 minutes ago       Up 6 minutes        6379/tcp                    cl-node2/robotconnect_redis_1
29faddfd38f1        tutum/hello-world   "/bin/sh -c 'php-fpm "   8 minutes ago       Up 6 minutes        192.168.99.108:80->80/tcp   cl-node1/robotconnect_web_1
```

## 6. スケールアウト/スケールイン
scaleコマンドで、イメージのコンテナ数を自由に変更できます。

* webサーバーを3つ起動する

```bash
$ docker-compose scale web=3
Creating and starting 2... done
Creating and starting 3... done

$ docker ps                 
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                       NAMES
3690c5a756a3        tutum/hello-world   "/bin/sh -c 'php-fpm "   35 seconds ago      Up 34 seconds       192.168.99.109:80->80/tcp   cl-node2/robotconnect_web_3
bec52a263c98        tutum/hello-world   "/bin/sh -c 'php-fpm "   35 seconds ago      Up 34 seconds       192.168.99.107:80->80/tcp   cl-manager/robotconnect_web_2
ac93efeba148        redis:latest        "/entrypoint.sh redis"   8 minutes ago       Up 7 minutes        6379/tcp                    cl-node2/robotconnect_redis_1
29faddfd38f1        tutum/hello-world   "/bin/sh -c 'php-fpm "   8 minutes ago       Up 7 minutes        192.168.99.108:80->80/tcp   cl-node1/robotconnect_web_1
```

* webサーバーを1つにする

```bash
$ docker-compose scale web=1
Stopping robotconnect_web_2... done
Stopping robotconnect_web_3... done
Removing robotconnect_web_3... done
Removing robotconnect_web_2... done

$ docker ps
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                       NAMES
ac93efeba148        redis:latest        "/entrypoint.sh redis"   8 minutes ago       Up 7 minutes        6379/tcp                    cl-node2/robotconnect_redis_1
29faddfd38f1        tutum/hello-world   "/bin/sh -c 'php-fpm "   9 minutes ago       Up 7 minutes        192.168.99.108:80->80/tcp   cl-node1/robotconnect_web_1
```