Docker Composeを使ってLAMP環境を立ち上げる

# Docker Composeとは

[Docker Hubのオフィシャルイメージを使ったLAMP環境構築](http://qiita.com/naga3/items/be1a062075db9339762d)でLAMP環境を構築することは出来たのですが、複数のコンテナの順番を意識して立ち上げなければならないので、手順書やシェルスクリプトなどを書く必要があり面倒です。

それを解決するために[Docker Compose](https://docs.docker.com/compose/)というツールを使うことにしました。複数のコンテナを管理して、立ち上げる順番やコンテナに渡すパラメータを指定することができるツールです。

# 使ってみる

https://github.com/naga3/docker-lamp こちらに一式まとめてあります。
先にDockerとDocker Composeをインストールしておいてください。

## Dockerのインストール

```
curl -fsSL https://get.docker.com/ | sh
```

参考: https://docs.docker.com/linux/step_one/

## Docker Composeのインストール

```
curl -L https://github.com/docker/compose/releases/download/1.6.2/docker-compose-`uname -s`-`uname -m` > /usr/local/bin/docker-compose
chmod +x /usr/local/bin/docker-compose
```

参考: https://docs.docker.com/compose/install/

## LAMP環境の起動

適当なディレクトリで

```bash
git clone https://github.com/naga3/docker-lamp.git
cd docker-lamp/
docker-compose up -d
```

これでLAMPを構成する複数のコンテナが自動的に立ち上がります。
ウェブブラウザでphpinfoの画面が出ることを確認してください。
ポートがぶつかる場合は、docker-compose.ymlのportsの左側の80を変更してください。

# docker-compose.yml

使うコンテナやパラメータなどを記述した手順書です。YAML形式なのでインデントに注意してください。

```YAML:docker-compose.yml
version: '2'
services:
  mysql:
    build: ./mysql
    environment:
      MYSQL_ROOT_PASSWORD: pass
    volumes:
      - db:/var/lib/mysql
  php:
    build: ./php
    ports:
      - '80:80'
    volumes:
      - ./html:/var/www/html
    depends_on:
      - mysql
volumes:
  db:
```

## docker-compose.yml : mysqlサービス

```
    build: ./mysql
```

mysql/Dockerfileの内容を元にイメージをビルドします。Dockerfileの内容については後述します。

```
    environment:
      MYSQL_ROOT_PASSWORD: pass
```

環境変数でMySQLのパスワードを指定します。docker runの-eオプションに対応します。

```
    volumes:
      - db:/var/lib/mysql
```

データベースの内容を永続化するために名前付きデータボリューム`db`を設定します。`docker inspect`コマンドでデータボリュームの場所が分かります。

## docker-compose.yml : phpサービス

```
    build: ./php
```

php/Dockerfileの内容を元にイメージをビルドします。Dockerfileの内容については後述します。

```
    ports:
      - '80:80'
```

ホスト側の80番ポートとコンテナ側の80番ポートを結びつけます。
YAMLの60進数時刻フォーマットと誤認識しないようにクォーテーションで囲んでいます。

```
    volumes:
      - ./html:/var/www/html
```

ホスト側の`html`ディレクトリをコンテナ側のドキュメントルートにマウントします。ここにコンテンツを置きます。

```
    depends_on:
      - mysql
```

phpサービスがmysqlサービスに依存していることを示します。これによりmysqlコンテナを先に立ち上げ、またphpコンテナ側からmysqlコンテナにアクセスできるようになります。

# mysql/Dockerfile

```
FROM mysql:5.7
COPY ./my.cnf /etc/mysql/conf.d/
```

```
FROM mysql:5.7
```

Docker Hubの公式[MySQLイメージ](https://hub.docker.com/_/mysql/)をベースイメージとします。

```
COPY ./my.cnf /etc/mysql/conf.d/my.cnf
```

ホスト側の`./my.cnf`ファイルをコンテナ側の`/etc/mysql/conf.d/`にコピーします。`/etc/mysql/my.cnf`の最後にこのディレクトリをインクルードしているのでMySQL起動時に設定が反映されます。

# mysql/my.cnf

```
[mysqld]
character-set-server=utf8
```

character setをUTF-8にしています。

# php/Dockerfile

```
FROM php:7-apache
COPY php.ini /usr/local/etc/php/
RUN apt-get update \
  && apt-get install -y libfreetype6-dev libjpeg62-turbo-dev libpng12-dev libmcrypt-dev \
  && docker-php-ext-install pdo_mysql mysqli mbstring gd iconv mcrypt
```

```
FROM php:7-apache
```

Docker Hubの公式[PHPイメージ](https://hub.docker.com/_/php/)をベースイメージとします。

```
COPY php.ini /usr/local/etc/php/
```

ホスト側にあるphp.iniをコピーしてコンテナ側のphp.iniとして設定します。

```
RUN apt-get update \
  && apt-get install -y libfreetype6-dev libjpeg62-turbo-dev libpng-dev libmcrypt-dev \
  && docker-php-ext-install pdo_mysql mysqli mbstring gd iconv mcrypt
```

必要そうな拡張機能を導入します。`docker-php-ext-install`は`php`イメージに含まれる拡張機能を導入するユーティリティです。

# php/php.ini

```
[Date]
date.timezone = "Asia/Tokyo"
[mbstring]
mbstring.internal_encoding = "UTF-8"
mbstring.language = "Japanese"
```

タイムゾーンとmbstringの日本語設定をします。