docker-compose で手軽なLAMP環境 (PHP5.6 or 7.1切替, Apacheにmod_rewrite, GDインストール)

MAMP Proが動かなくなったのでこれを機会にdocker-compose で環境構築してみました。動作確認したのはMacのみです。
どうしてもphp5.6でないと動かないCMS案件(baserCMS3系)だったので、リライトやGDのインストールもやってみました。
（一応 php7.1も動かせます）

[githubのデータはこちら → Garyuten/dockker\-lamp\-php5\.6 ](https://github.com/Garyuten/dockker-lamp-php5.6)

# この環境が向いてる人 

- PHP5.6など古めホスティングサーバー案件の環境を作らないといけない人
- Apacheのリライトの設定やGDのインストールなどを後からコマンドでやりたくない人
- ホスティングサーバーっぽい構成のLAMP(apache,php,mysql)環境が欲しい人

## この記事で構築される環境
- Apache
	- mod_rewrite
	- GD
- php 5.6.28 or php 7.1
- MySql 5.7
- PhpMyAdmin

## 動作確認したCMS
- php5.6.28
	- ✅ baserCMS 3.0.16
	- ✅ Wordpress 4.9.8 
- php7.1
	- ✅ baserCMS 4.1.3
	- ✅ Wordpress 4.9.8

### baserCMS3.0.16の場合 (php5.6.28)
インストールのDB接続成功
![スクリーンショット 2018-09-11 14.28.29.png](https://qiita-image-store.s3.amazonaws.com/0/5923/da69c874-58b1-3cb1-7a61-017d9f403636.png)

### baserCMS4.1.3の場合 (php7.1)
インストールのDB接続成功
![スクリーンショット 2018-09-11 14.25.16.png](https://qiita-image-store.s3.amazonaws.com/0/5923/737b34ea-b8ac-1d39-2c86-53056c5d7411.png)

### Wordpress4.9.8 の場合 (php7.1)
php7.1に切替えた後に確認(PHPのバージョン切替方法は後述)
![スクリーンショット 2018-09-11 14.23.09.png](https://qiita-image-store.s3.amazonaws.com/0/5923/20920fb5-c85d-053e-e040-0262f640bf89.png)
![スクリーンショット 2018-09-11 14.24.10.png](https://qiita-image-store.s3.amazonaws.com/0/5923/9c9ed657-2859-b876-8b72-1830e665c5ba.png)


# 事前準備

## Dockerのインストール
- [Docker Desktop](https://www.docker.com/products/docker-desktop) (公式)
- [DockerをMacにインストールする \(更新：2018/5/14\) \- Qiita](https://qiita.com/kurkuru/items/127fa99ef5b2f0288b81)

## Docker Composeのインストール
- [Docker Compose](https://docs.docker.com/compose/install/) (公式)
- [Docker Compose \- インストール \- Qiita](https://qiita.com/zembutsu/items/dd2209a663cae37dfa81)

## git クローン

```
git clone https://github.com/Garyuten/dockker-lamp-php5.6.git
```
もしくは [githubからzipをダウンロード](https://github.com/Garyuten/dockker-lamp-php5.6/archive/master.zip) して作業フォルダで解凍してください

# インストール・起動手順

```console

$ cd dockker-lamp-php5.6
$ docker-compose build
$ docker-compose up
```

これだけで、 [http://localhost:8080/](http://localhost:8080/) にアクセスできるようになります。
あとは```/public_html/```配下に WordpressなりbaserCMSなり置けばインストールできます。

mod_rewrite が有効かどうかは、 http://localhost:8080/hoge にアクセスして「 ✅ mod_rewrite is ok! 」 の表示がでれば有効なことが確認できます。

```docker-compose build```は初回のみ、かなり時間がかかります。気長に待ちましょう。

## バックエンドでの起動方法
```console
$ docker-compose up -d
```
ターミナルに出力されなくなります

## docker終了方法

ターミナル(コンソール)上で ```Cmd + C``` （以外に忘れる）

## MySQLの接続情報
- database host : **192.168.202.2** (default)
- database user : **root**
- database pass : **root**
- database port : **3306**

```database host : 192.168.202.2```は変更可能です（後述）

###phpMyAdmin
[http://localhost:8088/](http://localhost:8088/) でアクセスできます。
![スクリーンショット 2018-09-11 14.29.31.png](https://qiita-image-store.s3.amazonaws.com/0/5923/0d20671c-df7d-bbb1-5bdf-1fd6418aa4ab.png)

LAMPを動かすなら上記まででOK❗❗🙆

## エラー： debconf: delaying package configuration, since apt-utils is not installed が出た場合

気にしなくていいらしいです。毎回でますが特に問題なく動いてます。

参考：["debconf: delaying package configuration, since apt\-utils is not installed"を表示しないようにする \- Qiita](https://qiita.com/haessal/items/0a83fe9fa1ac00ed5ee9)

---

これから先はファイルの説明になります。

# ディレクトリ構成と各ファイルの説明
```
├ public_html : Document root
├ docker-compose.yml
└ docker
  ├ web
    ├ Dockerfile : php veersion, apache install
    ├ base.conf : <VirtualHost *:80>
    ├ php.ini
  ├ db
    ├ Dockerfile : mysql install
    ├ my.cnf
  ├ logs : server log
```
## public_html
ドキュメントルートになります。 http://localhost:8080 でアクセスされる領域です。
```.htaccess```も有効です。

## docker-compose.yml

mysql を繋ぐためにIPアドレスを固定しています。

```yml:docker-compose.yml
version: '2'
services:
  mysql:
    container_name: projectname_mysql
    build: ./docker/db
    volumes:
      - ./docker/db/mysql_data:/var/lib/mysql
    ports:
      - "3306:3306"
    hostname: localhost
    environment:
      MYSQL_ROOT_PASSWORD: 'root'
    # 所属するネットワークとIPを指定
    networks:
      br0:
        # このIPアドレスがデータベースホスト名になる ( localhost → 192.168.202.2)
        ipv4_address: 192.168.202.2
  web:
    container_name: projectname_apache_php
    build: ./docker/web
    ports:
      - '8080:80'
    volumes:
      - ./public_html:/var/www/html
      - ./docker/logs:/var/log/httpd
    depends_on:
      - mysql
    # 所属するネットワークとIPを指定
    networks:
      br0:
        ipv4_address: 192.168.202.3
  phpmyadmin:
    container_name: projectname_phpmyadmin
    image: phpmyadmin/phpmyadmin
    environment:
      - PMA_ARBITRARY=1
      - PMA_HOST=mysql
      - PMA_USER=root
      - PMA_PASSWORD=root
    links:
      - mysql
    ports:
      - 8088:80
    volumes:
      - /sessions
    # 所属するネットワークとIPを指定
    networks:
      br0:
        ipv4_address: 192.168.202.4

# 新規ブリッチを定義
networks:
  br0:
    driver: bridge
    ipam:
      config:
      - subnet: 192.168.202.0/24
        gateway: 192.168.202.1
```

### $ docker-compose up で以下のエラーになった場合
```terminal
$ docker-compose up
Recreating projectname_mysql ... error

ERROR: for projectname_mysql  Cannot start service mysql: b"Invalid address 192.168.202.2: It does not belong to any of this network's subnets"

ERROR: for mysql  Cannot start service mysql: b"Invalid address 192.168.202.2: It does not belong to any of this network's subnets"
ERROR: Encountered errors while bringing up the project.
```
おそらく2つ以上のLAMP環境を作ろうとした時に出ると思います。
docker上で同じIPアドレスがあると動かせないので、docker-compose.yml内のIPアドレスを```192.168.200.*```を書き換えてください。

例） 192.168.202.* → 192.168.210.* などで検索置換

**※注意**
mysqlのipv4_address を書き換えた場合は、
**mysqlの接続情報のホスト名が変わります！！**

## docker/web/Dockerfile

apacheの必要なモジュール、mod_rewriteの有効、GDのインストール、phpのバージョン指定など設定

```dockerfile:docker/web/Dockerfile
FROM php:5.6.28-apache
# FROM php:7.1-apache #php7をインストールしたい方はこちらを有効に

MAINTAINER docker-web

RUN apt-get update \
    && apt-get -y install vim wget lsb-release libicu-dev mysql-client \
    && docker-php-ext-install pdo_mysql mysqli intl
# mod_rewriteを 有効に
RUN a2enmod rewrite

RUN ln -s /etc/apache2/mods-available/vhost_alias.load /etc/apache2/mods-enabled
RUN echo ServerName $HOSTNAME > /etc/apache2/conf-available/fqdn.conf && a2enconf fqdn
RUN a2enmod headers
RUN a2enmod include

# GD関連のインストール
RUN apt-get update && apt-get install -y \
        libfreetype6-dev \
        libjpeg62-turbo-dev \
        libpng-dev
RUN docker-php-ext-install gd


COPY ./base.conf /etc/apache2/sites-available/base.conf
RUN a2ensite base.conf

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

# ポートの解放
EXPOSE 80
```

## docker/web/base.conf

apacheの設定。 ```AllowOverride All```で ```.htaccess```が有効になります。
ログの出力も設定可能です。
以下の設定では ```docker/log/``` 内に出力されます。


```conf:docker/web/base.conf
<VirtualHost *:80>
    DocumentRoot "/var/www/html"
    Options Includes
    ErrorLog "/var/log/httpd/localhost-error_log"
    CustomLog "/var/log/httpd/localhost-access_log" custom
    <Directory "/var/www/html">
        AllowOverride All
    </Directory>
</VirtualHost>
```

## docker/web/php.ini

PHPの設定

```ini:docker/web/php.ini
[Date]
date.timezone = "Asia/Tokyo"

[mbstring]
mbstring.internal_encoding = UTF-8
mbstring.language = Japanese
```

## docker/db/Dockerfile

MySQLのバージョン指定

```dockerfile:docker/web/Dockerfile
FROM mysql:5.6
MAINTAINER docker-db

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


## docker/db/my.cnf

MySQLの設定

```ini:docker/db/my.cnf
[mysqld]
character-set-server=utf8
datadir = /var/lib/mysql
```

説明は以上になります。

## PHP versionの変更方法

```docker/web/Dockerfile``` をテキストエディタで編集します。
最初の1-2行目で使いたいバージョン以外をコメントアウトするだけです。

### php5.6にしたい場合
```Dockerfile:docker/web/Dockerfile
FROM php:5.6.28-apache
# FROM php:7.1-apache
```
### php7.1にしたい場合
```Dockerfile:docker/web/Dockerfile
# FROM php:5.6.28-apache
FROM php:7.1-apache
```

#参考サイト

一番参考になったのはこちら（感謝！）

- [Docker for MacとDocker ComposeでLAMP環境を作る \- bitA Tech Blog](https://tech.bita.jp/article/3)
- [dockerのコンテナに固定IPを振る \- Qiita](https://qiita.com/reflet/items/e10442c16834a9ce15b3)


他

- [Docker for MacとDocker ComposeでささっとLAMP環境を作る \- Qiita](https://qiita.com/tatsuno/items/c9bbb604d8338551b5dc)
- [DockerでPHP7\.1とApacheの環境を構築 \- IT石ログ](http://it.hirokun.net/entry/docker-php71apache)
- [DockerでLaravel\+PHP5\.6\+MySQL5\.6\+Apacheの環境構築 \- Qiita](https://qiita.com/eidera/items/19decbfc290b4776cfc3)
- [今更ながらDockerでCentOS PHP5\.6 の環境を構築 \- 気ままに](http://unot13.hatenablog.com/entry/2018/04/10/171329)
- [Dockerで立ち上げたwebサーバでmod\_rewriteしたかった話 \- MagChoの雑記](http://magcho.hatenablog.jp/entry/2017/08/11/213243)
- [Apacheのmod\_rewrite設定メモ \- Qiita](https://qiita.com/Y-Kanoh/items/42af3c2f635653c4eaf7)

もし baserCMS4系 の最新制作環境が欲しい人はこちら (Mac)
- [basercms/docker at dev\-4 · baserproject/basercms](https://github.com/baserproject/basercms/tree/dev-4/docker)