テスト環境をDockerで作成する(Webサーバ+DBサーバ+Javaアプリ)

## ■目的

[こちら](http://qiita.com/nagi244/items/10623f509bba6887192d)で記載した、「こんなテスト環境にしたい」の理想系を目指します。
各サーバのディストリビューションやバージョンは気にせず、ミドルウェアのバージョンが合っていれば良い前提とします。

## ■Docker Compose

今まではDockerfileを作成してイメージ作成→コンテナ起動、としていましたが、各サーバのイメージを作成して起動して...というのは面倒です。
そこで「Docker Compose」を使用して、複数のサーバを一気に操作してしまいます。Docker Composeのインストールは[公式サイト](https://docs.docker.com/compose/install/)に記載されています。

## ■ファイル構成

今回は以下のファイル構成としました。

```
docker-hoge-service
│
├── apache (← Apache関連フォルダ)
│   │
│   └── Dockerfile (← Apacheイメージ用のDockerfile)
│
├── docker-compose.yml (← Docker Compose設定ファイル)
│
├── java (← Java関連フォルダ)
│   │
│   ├── Dockerfile (← Javaイメージ用のDockerfile)
│   │
│   └── hoge-0.0.1.jar
│
├── mysql(← MySQL関連フォルダ)
│   │
│   ├── Dockerfile (← MySQLイメージ用のDockerfile)
│   │
│   ├── initdb.d (← 初期実行SQL格納フォルダ)
│   │   │
│   │   └── hoge.sql (← 初期実行SQLファイル)
│   │
│   └── my.cnf
│
└── var (← 永続化用データ格納フォルダ)
```

## ■ApacheのDockerfile

「apache」の「Dockerfile」の中身は以下のようにしました。
「2.4」は使用したいバージョンを指定します。指定できるバージョンは[こちら](https://hub.docker.com/_/httpd/)で確認できます。

```yaml:Dockerfile
FROM httpd:2.4
MAINTAINER nagi244<hoge@hoge.co.jp>

# ドキュメントルート下に「hoge」フォルダを作成
RUN mkdir -m 777 /usr/local/apache2/htdocs/hoge

EXPOSE 80
```

## ■JavaのDockerfile

「java」の「Dockerfile」の中身は以下のようにしました。
Javaは[公式](https://hub.docker.com/_/java/)の方はOpenJDKでしたので、今回は[こちら](https://hub.docker.com/r/lwieske/java-8/)を使用させていただきました。

```yaml:Dockerfile
FROM lwieske/java-8:jdk-8u20
MAINTAINER nagi244<hoge@hoge.co.jp>

ADD *.jar /home/hoge.jar

CMD ["java", "-jar", "/home/hoge.jar"]
```

## ■MySQLのDockerfile

「mysql」の「Dockerfile」の中身は以下のようにしました。
「5.6」は使用したいバージョンを指定します。指定できるバージョンは[こちら](https://hub.docker.com/_/mysql/)で確認できます。

```yaml:Dockerfile
FROM mysql:5.6
MAINTAINER nagi244<hoge@hoge.co.jp>

COPY my.cnf /etc/my.cnf

# 「/docker-entrypoint-initdb.d/」にSQLファイルを置いておくと、初回起動時に実行される
COPY initdb.d/*.sql /docker-entrypoint-initdb.d/

EXPOSE 3306
```

## ■Docker Composeのファイル

「docker-compose.yml」の中身は以下のようにしました。
`volumes`のアクセスモードは未指定の場合何になるのか不明...。
([リファレンス](https://docs.docker.com/compose/compose-file/#volumes-volume-driver)にも記載されていないような)

```yaml:docker-compose.yml
hoge-mysql:
    build: mysql
    ports:
        - "3306:3306" # [外部向けポート:内部ポート]
    container_name: hoge-mysql
    environment:
        - MYSQL_ROOT_PASSWORD=hoge_root_pass
        - MYSQL_DATABASE=hoge
        - MYSQL_USER=hoge
        - MYSQL_PASSWORD=hoge_pass
    # MySQLのコンテナ内のDBデータ(/var/lib/mysql)を、Dockerを動かしているホスト(./var/mysql/hoge)に保存 = データの永続化
    volumes:
        - ./var/mysql/hoge:/var/lib/mysql # ホスト:コンテナ:アクセスモード(今回は省略)

hoge-apache:
    build: apache
    ports:
        - "80:80"
    container_name: hoge-apache
    volumes:
        - ./var/apache/hoge:/usr/local/apache2/htdocs/hoge

hoge-java:
    build: java
    ports:
        - "10000:10000"
    container_name: hoge-java
    links:
        - hoge-mysql # MySQLのコンテナ名を指定。JavaコンテナからMySQLコンテナへ「hoge-mysql」という名前でアクセスできる。
        - hoge-apache # Apacheのコンテナ名を指定。JavaコンテナからApacheコンテナへ「hoge-apache」という名前でアクセスできる。
```

## ■全イメージ作成 & コンテナ起動

以下のコマンドを叩けば、「docker-compose.yml」に記載しているすべてのイメージ作成 & コンテナ起動までが実行されます。
`-d`はバックグラウンドで実行させるために付けています。

`$ docker-compose up -d`

指定したものだけ実行したい場合は、以下のコマンドを叩きます。

`$ docker-compose up -d hoge-mysql`

## ■コンテナ起動確認

コンテナが起動したか確認する場合は、以下のコマンドを叩きます。

`$ docker-compose ps`

## ■全コンテナ停止

以下のコマンドを叩けば、すべてのコンテナが停止します。

`$ docker-compose stop`

指定したものだけ停止したい場合は、以下のコマンドを叩きます。

`$ docker-compose stop hoge-mysql`

***
以上で、「Webサーバ+DBサーバ+Javaアプリ」のコンテナをDockerで作成することができました！
コンテナ名とポートを変更すれば、複数のテスト環境を作成することができそうです。