Dockerを使ってLaravel開発環境構築(Apache)

#はじめに
今回はDockerを使ってapache上でPHP実行環境を構築し、Laravel新規プロジェクト作成までを行います。

#環境
Dockerとdocker-composeは用意できている前提です。
Docker version 18.06.0-ce
docker-compose version 1.22.0
Apache 2.4
PHP 7.2
Laravel 5.7

#構成
以下の構成を想定しています。

```
project
├── docker
│   ├── Dockerfile
│   ├── apache
│   │    └── 000-default.conf
│   ├── db
│   │    ├── data
│   │    ├── my.cnf
│   │    └── sql
│   │  　     ├── 001-create-tables.sql
│   │ 　      └── init-database.sh
│   └── php
│        └── php.ini
├── docker-compose.yml
└── server

```


#構築
環境構築の手順を解説を簡単に交えながら紹介していきます。

##1. ディレクトリ作成
まず、任意のディレクトリ(上記ではproject)を作成します。
その直下にdocker, serverを作成します。dockerディレクトリの直下にapache, php, dbのディレクトリを作成します。また、dbの中にはdataディレクトリも作成しておいてください。

##2. docker-compose.yml作成
今回は、web, mysql, phpmyadminの3つのコンテナを想定しておりますので、以下のようになります。

```docker-compose.yml
version: '3'

services:
  web:
    container_name: web
    build: ./docker
    ports:
      - 80:80
    privileged: true
    volumes:
      - ./server:/var/www/html

  db:
    image: mysql:5.7
    container_name: db-host
    environment:
      MYSQL_ROOT_PASSWORD: root
      MYSQL_DATABASE: docker-database
      MYSQL_USER: docker
      MYSQL_PASSWORD: docker
      TZ: 'Asia/Tokyo'
    command: mysqld --character-set-server=utf8mb4 --collation-server=utf8mb4_unicode_ci
    volumes:
      - ./docker/db/data:/var/lib/mysql
      - ./docker/db/my.cnf:/etc/mysql/conf.d/my.cnf
      - ./docker/db/sql:/docker-entrypoint-initdb.d
    ports:
      - 3306:3306
      
  phpmyadmin:
    container_name: phpmyadmin
    image: phpmyadmin/phpmyadmin
    environment:
      - PMA_ARBITRARY=1
      - PMA_HOSTS=db-host
      - PMA_USER=root
      - PMA_PASSWORD=root
    ports:
      - 8080:80
```

## 3. Dockerfile作成 
webコンテナ構築時に使われるDockerfileをdockerディレクトリ直下に作成します。
Composerのインストールは[公式](https://getcomposer.org/download/)を参考にしてください。

```dockerfile:Dockerfile
FROM php:7.2-apache
COPY ./php/php.ini /usr/local/etc/php/
COPY ./apache/*.conf /etc/apache2/sites-enabled/

RUN apt-get update \
  && apt-get install -y zlib1g-dev libpq-dev mariadb-client unzip\
  && docker-php-ext-install zip pdo_mysql mysqli \
  && docker-php-ext-enable mysqli

COPY --from=composer:latest /usr/bin/composer /usr/bin/composer
ENV COMPOSER_ALLOW_SUPERUSER 1
ENV COMPOSER_HOME /composer
ENV PATH $PATH:/composer/vendor/bin

WORKDIR /var/www/html

RUN composer global require "laravel/installer"
```

##4. PHP設定ファイル作成
PHPの設定ファイルをdocker/php/に作成します。以下、最低限の設定ですのでプロジェクトに応じて変更してください。

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

##5. apache設定ファイル作成
apacheの設定ファイルをdocker/apache直下に作成します。以下はLaravelでの運用を前提に記載しています。

```000-default.conf
<VirtualHost *:80>

        ServerAdmin webmaster@localhost
        DocumentRoot /var/www/html/public

        ErrorLog ${APACHE_LOG_DIR}/error.log
        CustomLog ${APACHE_LOG_DIR}/access.log combined

</VirtualHost>
```

##6. Laravelプロジェクト作成
では、dockerを起動して、Laravelプロジェクトを作成してみましょう。
docker-compose.ymlがあるディレクトリに移動して下記でdockerを起動してみましょう。
その後dockerに入って、Laravelプロジェクトを作成します。

```
# docker起動
$ docker-compose up -d

# webコンテナに入ります
$ docker-compose exec web bash

# Laravelプロジェクト作成
$ laravel new
```
server以下にLaravelの各ディレクトリやファイルができています。

##7. 動作確認
ブラウザから http://127.0.0.1:80 にアクセスしてみましょう。以下のようにLaravelの画面が立ち上がっていれば成功です。
<img width="1254" alt="スクリーンショット 2018-09-30 21.19.02.png" src="https://qiita-image-store.s3.amazonaws.com/0/290840/2bce8e3d-ef19-27f4-692e-f777def7362d.png">

MySQL, phpMyAdminのコンテナも確認しておきましょう。
ブラウザから http://127.0.0.1:8080 にアクセスしてみましょう。
phpMyAdminが表示されたら大丈夫です。