LaradockでLaravel5.6環境を構築する

本記事では、Laravel5.6での環境をLaradockを利用して構築する方法を説明して行く。
* 追記
現在の最新バージョンのLaradockではこの記事の方法で動作しないことがあるようです。
この記事を作成した段階のコミットハッシュをリンクしておきます。
[本記事作成時のLaradockのリポジトリ](https://github.com/laradock/laradock/tree/1d9cbd7c75a481cd86c23912841092b0aeb70890)
## はじめに
以前に[Laravel5.4の環境構築](https://qiita.com/Syo_pr/items/4994f71e8c9152ceee0d)という記事を書いたが、現在では求められるPHPのバージョンがPHP7.1まで(Laravel5.6から)引き上げられた。
Laradockの使い方も以前の記事が参考にならないレベルで大きく仕様が変更された。

日本のエンジニアがあまりLaradockを使っていないのか、最新のLaradockの日本語文献が全く出てこないので、自分の今後の構築のためも含めて記述しておく。

## 実行環境
LaradockはDockerの実行できる環境であれば、基本的に実行できるが、パーミッションの問題など私の実行した環境では起こらなかった問題が起こる場合があるので、一応実行環境を記載する。

基本的にDocker for Macの方がLinuxでDockerを動かすよりもパーミッションの問題に当たりにくい。
多分、仮想マシン上のLinuxでDockerエンジンを動かしているからだと思われる。

マシーン環境：MacBookPro
OS：MacOS Sierra
スペック：Intel Core i7 3.3GHz
メモリ：16GB 2133MHz DDR3
Docker：Version 18.03.0-ce-mac60(23751)
Laravel：v5.6.21

## Laradockの設定
まず、適当なディレクトリにgithubからリポジトリをクローンする
そして環境変数を設定し、dockerコンテナを起動する

```setup.sh
git clone https://github.com/Laradock/laradock.git Laradock
cd Laradock
cp env-example .env
docker-compose up -d nginx mysql phpmyadmin redis workspace
```

上記のコマンドを実行してしばらく経つとnginx・php-fpm・redis・mysql・workspace・phpmyadminの環境が自動で作成される。
各コンテナの役割を以下で説明する。

 - nginx (Webサーバ)
 - php-fpm (PHPを実行する為のcgi環境)
 - redis (KVSのサーバ、多分Laravelの標準の状態だとセッションの保存に利用)
 - mysql (RDBのサーバ永続的なデータストア)
 - workspace　（Laravelの開発をする為の実行環境がまとまったコンテナ）
 - phpmyadmin (DBをWeb上から操作できる、個人的には不要なオプションのコンテナ)

## Laravelの環境を構築
Laravelの開発をLaradockでするには、workspaceコンテナを利用する。
今回はsampleという名前のプロジェクトを作る。

```setup.sh
docker-compose exec workspace bash
composer create-project --prefer-dist laravel/laravel sample
cd sample
vim .env
```

ここまでコマンドを実行すると、環境変数の設定に入る。
Dockerは**links**を指定するとその名前のコンテナ名がlinksを指定したコンテナにホスト名としてリンクされる。
Laradockでは、workspaceにmysqlとredisがlinksされている。
なので、以下の部分の設定を変更する。
※DB_DATABASEとDB_USERNAMEはdefaltに変更する必要がある。

```.env
DB_HOST=mysql
DB_DATABASE=default
DB_USERNAME=default
REDIS_HOST=redis
```

変更後に環境変数設定をした.envを保存する。

## nginxのconfigのドキュメントルートを編集

その後、control + p + qを押してコンテナからデタッチする。
デタッチ後に、以下のコマンドを実行する。

```setup.sh
cd ../Laradock
vim .env
```

ここで、以下の.envの項目を変更する。
今回はプロジェクト名をsampleにしているので、ここもsampleのディレクトリにする。
ここで、Laravelのユーザはなぜ、```../sample/public/```を指定しないのかと思うかもしれないが、```../sample/```で大丈夫なのだ。
理由は、nginxのsites/default.confにrootのディレクトリ指定が```/var/www/public```になっているからだ。

```
APP_CODE_PATH_HOST=../sample/
```

これで設定は全て完了である。
最後に変更したnginxの設定を変更する為に以下のコマンド実行する。

```setup.sh
docker-compose stop
docker-compose up -d nginx mysql phpmyadmin redis workspace
```

##実行できるか確認
ブラウザで以下のURLにアクセスして正しくアクセスできるか確認する。
http://localhost

Laravelの初期画面が表示されたら環境構築は終了。

## LaradockでHTTPSに対応する (2018.06.02 追記)
Laravelを利用していると、FacebookのソーシャルログインなどでHTTPSの通信がしたいことがある。
そんな時にLaradockでHTTPSの通信を実現する方法を記していく。

まず、 ```Laradock/nginx/Dockerfile``` の中身を少し変更する。

```Dockerfile.sh
FROM nginx:alpine

LABEL maintainer="Mahmoud Zalt <mahmoud@zalt.me>"

COPY nginx.conf /etc/nginx/

# If you're in China, or you need to change sources, will be set CHANGE_SOURCE to true in .env.

ARG CHANGE_SOURCE=false
RUN if [ ${CHANGE_SOURCE} = true ]; then \
    # Change application source from dl-cdn.alpinelinux.org to aliyun source
    sed -i 's/dl-cdn.alpinelinux.org/mirrors.aliyun.com/' /etc/apk/repositories \
;fi

RUN apk update \
    && apk upgrade \
    && apk add --no-cache bash \
    && apk add --no-cache openssl \
    && adduser -D -H -u 1000 -s /bin/bash www-data

ARG PHP_UPSTREAM_CONTAINER=php-fpm
ARG PHP_UPSTREAM_PORT=9000

# Set upstream conf and remove the default conf
RUN echo "upstream php-upstream { server ${PHP_UPSTREAM_CONTAINER}:${PHP_UPSTREAM_PORT}; }" > /etc/nginx/conf.d/upstream.conf \
    && rm /etc/nginx/conf.d/default.conf

RUN mkdir /etc/nginx/ssl 2> /dev/null
RUN openssl genrsa -out "/etc/nginx/ssl/localhost.key" 2048 \
    && openssl req -new -key "/etc/nginx/ssl/localhost.key" -out "/etc/nginx/ssl/localhost.csr" -subj "/CN= localhost/O= localhost/C=UK" \
    && openssl x509 -req -days 365 -in "/etc/nginx/ssl/localhost.csr" -signkey "/etc/nginx/ssl/localhost.key" -out "/etc/nginx/ssl/localhost.crt"

CMD ["nginx"]

EXPOSE 80 443
```

その後、```Laradock/nginx/sites/default.conf``` を変更して行く。
変更箇所は上部の1~13行である。

```default.conf
server {

    listen 80 default_server;
    listen 443 ssl;
    listen [::]:80 default_server ipv6only=on;

    server_name localhost;
    root /var/www/public;
    index index.php index.html index.htm;

    ssl_certificate     /etc/nginx/ssl/localhost.crt;
    ssl_certificate_key /etc/nginx/ssl/localhost.key;

                       ・・・・・省略・・・・・

}
```

最後にコンテナをもう一度Buildから実行する

```
docker-compose build nginx
docker-compose stop nginx
docker-compose up -d nginx
```

## おわりに
今回はLaradockを使ってLaravel5.6の環境を構築した。
ネット上の日本語文献が軒並み古いLaradockの使い方しか乗っておらず、更新もされていないので、この記事をみてLaravelの環境を手軽に作れる人が増えたら嬉しい。

## 参考
 - [Laradockの公式ドキュメント](http://laradock.io/)
 - [Laravel5.6の公式ドキュメント](https://laravel.com/docs/5.6/installation)
 - [How to add SSL to NGINX in laradock.](https://github.com/laradock/laradock/issues/1084)