Docker for Mac (+ Docker Compose)でいい感じのLAMP開発環境を構築する

# はじめに
以前に [VagrantとDocker for Mac で〜](http://qiita.com/jey0taka/items/c0b52950e70774081efe) という記事を書きましたが、
現時点でのVagrant と Docker の組み合わせでは、若干の不具合がある事と、Dockerとは別にVagrantをインストール必要がありました。※詳しくは記事参照

そこで、今回は Docker for Mac に標準で含まれる、Docker Compose を用いて、環境を作成してみます。

# Docker Compose　とは？
- 複数のコンテナを連携して利用する場合に、従来であれば、それぞれのコンテナを個別に、管理（起動・停止・構築など）していたものを、YAMLにて定義したファイルを用いて、複数コンテナを同時に管理できる仕組みです。

# 仕様

仕様は前回と同じですが、幾つか追加も行いました。

- web用・DB用と、2つのコンテナを1つの```docker-compose.yml```にて定義しています。
- ```docker-compose```コマンドにて2つのコンテナは同時に起動・停止します。
- ホスト（Mac）上のディレクトリを、web用コンテナ上の(Webサーバーの)ドキュメントルートにマウントし、ホスト（Mac）から直接、編集・更新ができます。
- Apacheの設定もホスト（Mac）上から（.htaccesで変更できない項目も）追加・編集できるようにしました。
- デバッグのため、WEBサーバーのアクセスログ・エラーログをホスト（Mac）上に出力するように変更しました。

# ファイル構成

```
./
 ├ docker-compose.yml
 ├ web/
 │  └ Dockerfile
 ├ var/
 │  ├ logs/
 │  └ public_html/　
 └ files/
    └ apache_conf/
       └ 00_virtualhost.conf
 ```

## ./docker-compose.yml
- docker-compose にて連携を定義したファイル、詳細は後述

## ./web/Dockerfile
- コンテナイメージ作成用のファイル、詳細は後述

## ./var/logs/
- コンテナ内のApacheのログが保存されます。（docker-compose.ymlにて、コンテナへのマウントを定義しています、コンテナイメージのリビルドなしで変更可能です）

## ./var/public_html/
- コンテナ内のApacheのドキュメントルートです。（docker-compose.ymlにて、コンテナへのマウントを定義しています、コンテナイメージのリビルドなしで変更可能です）

## files/apache_conf/00_virtualhost.conf
- Apacheの追加設定です。（docker-compose.ymlにて、コンテナへのマウントを定義しています、コンテナイメージのリビルドなしで変更可能です）

# Dockerfileの詳細
オフィシャルのCentOSイメージを元に、できるだけシンプルにまとめました。

```
FROM centos:latest

# Install & Add repo
RUN rpm -Uvh https://dl.fedoraproject.org/pub/epel/epel-release-latest-7.noarch.rpm
RUN rpm -Uvh http://rpms.famillecollet.com/enterprise/remi-release-7.rpm

# Install PHP5.6 & Apache
RUN yum --enablerepo=remi-php56 install php php-devel php-gd php-xml php-mbstring php-opcache php-mcrypt php-mysqlnd -y

# Clear yum cache
RUN yum clean all

# for web
EXPOSE 80

CMD /usr/sbin/httpd -DFOREGROUND
```

# docker-compose.yml

```
version: '2'
services:
  # mysql
  db01:
    image: mysql:5.6
    ports:
      - "3306:3306"
    environment:
      MYSQL_ROOT_PASSWORD: root

  # web
  web01:
    build: ./web
    image: web:24
    ports:
      - "80:80"
    links:
      - "db01:db01"
    volumes:
      - ./var/public_html:/var/www/public_html
      - ./var/logs:/var/log/httpd
      - ./files/apache_conf/00_virtualhost.conf:/etc/httpd/conf.d/00_virtualhost.conf
```


## docker-compose.ymlの解説
### version: '2'
- 記載にはVersion1/2と選択できますが、今回はVer.2を用いいました。

### services:  db01:　/ web01:
- 稼働するサービス（コンテナ）を定義します。Ver.2での記載では必須です。

### image: mysql:5.6
- 起動するコンテナイメージを指定しています。Dockerホスト内にイメージがない場合は、自動的にDockerHUBよりダウンロードされます。

### ports:
- 各コンテナで[フォワード先のポート：(コンテナで)解放するポート]を指定　

### environment:
- コンテナ起動時に実行するコマンド（MySQLでのrootユーザーのパスワードの設定）

### build: ./web
- DockerFileの保存先を指定

### image: web:24
- ```build:```以下の```images:```にてビルド後のイメージ名の指定、Ver.2のみ記載可能

### links:
- コンテナ間のリンクの指定
  - web01コンテナとdb01をリンク
  - web01からは、ホスト名db01にてdb01に接続が可能

### volumes:
- ホスト（Mac）上のファイル・ディレクトリをコンテナ上にマウント
 - ./var/public_html:/var/www/public_html
- ./var/logs:/var/log/httpd
- ./files/apache_conf/00_virtualhost.conf:/etc/httpd/conf.d/00_virtualhost.conf

# コンテナの起動・停止

## コンテナの起動
```$ docker-compose up -d```

- 初回起動時には、イメージのビルド・コンテナの起動などを```docker-compose.yml```に沿って実行します。

- ```-d``` オプションにてコンテナをバックグラウンドで実行

## コンテナの停止
```$ docker-compose stop```

- 関連するコンテナが停止されます。

## Apacheの設定変更
- ```00_virtualhost.conf``` を適時修正の上、Web01コンテナを再起動させます。
- Web01コンテナのみの再起動は```$ docker-compose restart web01``` にて実施します。

## 利用方法
1. ホスト（Mac）上のブラウザからlocalhostを開くとpublic_htmlに設置したファイルが見れます。
2. PHPプログラム（web01コンテナ）からDBを参照する場合は、ホスト名にdb01を指定ください。
3. ホスト（Mac）上からDBを参照する場合は、127.0.0.1:3306にて参照可能です。

# まとめ
コンテナ上にあるApacheの設定変更の場合、設定ファイルをイメージ内に組み込んでじまうと、Dockerイメージのリビルドが必要となり、開発環境としては利便性が下がります。
そこで、今回は必要なファイルをホスト（Mac）上に置き、```volumes```にてマウントすることで、ファイルの修正を容易にしました。

```Docker Compose```は、```Docker for Mac```に標準で含まれているため、インストールも容易で、別途インストールの必要もありません。

```Vagrant``` との組み合わせに比べ、より簡単に開発環境が用意できるかと思います。

たぶんWindows版でも稼働可能です。

#　ソース
https://github.com/jey0taka/docker-compose-sample