Laravelの開発環境をLaradockを使って構築する

この記事は[Laravel #2 Advent Calendar 2018](https://qiita.com/advent-calendar/2018/laravel-2) 20日目の記事です。
枠が余っていたので投稿しました！

Laradockを使って環境構築をする機会があったのでその時のメモを残します。
[Homestead](https://qiita.com/ucan-lab/items/9b97fbf0b43c0849fd51) で環境構築した記事もあります。

## Laradockとは

- 公式 http://laradock.io
- ソース https://github.com/laradock/laradock

LaradockとはDocker作られたのオールインワンなPHP開発環境です。
素晴らしいPHP開発環境を提供するように事前にパッケージ化されたDockerイメージが含まれています。

### Laradockの特徴

- PHPのバージョンを簡単に切り替えできる(7.3/7.2/7.1/5.6)
- 好きなデータベースエンジンを選択できる(MySQL/Postgres/MariaDB...)
- Memcached、HHVM、Beanstalkdなど、独自のソフトウェアの組み合わせが可能
- PHP-FPM、NGINX、PHP-CLIなど、すべてのソフトウェアは別々のコンテナ上で動作
- すべてのDockerイメージは公式ベースのイメージから構築
- プロジェクトごとにLaradockを使用することも、すべてのプロジェクトに対して単一のLaradockを使用することも可能

### 実際の現場では

Laradockは全部入りな環境のため、大体のプロジェクトにはオーバースペックであり、メンテナンスコストが高いです。
初回ビルドに時間がかかるため、1人チームだといいですが何人も人員がいると構成が変わるたびにビルドし直して〜のコストはバカにならないです。

なので仕事ではLaradockは使用しません。開発環境や本番環境にLaradock使ってるよ的な話は私の周りでは聞いたことないです...。
実際の現場では [Laravelの開発環境をDockerを使って構築する](https://qiita.com/ucan-lab/items/17c806973e69792ada99) のこちらの記事を元に開発をしてます。

## 事前準備

### Dockerインストール

Dockerのインストールはhomebrew caskから簡単にインストールが行えます。

```
$ brew cask install docker
$ open /Applications/Docker.app
```

- https://www.docker.com
- https://docs.docker.com/compose

### Kitematicインストール

DockerコンテナをGUIで管理できます。
今回は使用しませんが、入れておくと便利です。

```
$ brew cask install kitematic
$ open /Applications/Kitematic.app
```

- https://kitematic.com

### TablePlusインストール

RDB用のGUIツール。MySQL8.0系にも対応してます。
phpmyadminよりTablePlusの方が使いやすいのでインストール推奨です。

- https://tableplus.io

## Dockerバージョン

```
$ docker -v
Docker version 18.09.0, build 4d60db4

$ docker-compose -v
docker-compose version 1.23.2, build 1110ad01

$ docker-machine -v
docker-machine version 0.16.0, build 702c267f
```

## ディレクトリ構成について

今回は、このようなディレクトリ構成で進めていきたいと思います。
環境構築の際に触れるファイルの位置も確認しておきましょう。

```
~/work => 作業用ディレクトリ
~/work/laradock => Laradockの環境
~/work/laradock/.env => Laradockの環境設定ファイル
~/work/laradock/mysql/my.cnf => LaradockのMySQL設定ファイル
~/work/sampleapp => Laravelの環境
~/work/sampleapp/.env => Laravelの環境設定ファイル
```

## Laradockのダウンロード

```
$ cd ~
$ mkdir work
$ cd work
$ git clone https://github.com/laradock/laradock.git
```

今回はホームディレクトリ直下に作業ディレクトリ(work)を作成しました。
作業ディレクトリにLaradockをgit cloneしてダウンロードします。

## Docker環境の設定

```
$ cd laradock
$ cp env-example .env
```

laradockディレクトリへ遷移して、Laradock環境設定ファイルのひな形をコピーして `.env` ファイルを作成します。

### MySQL8.0 を使用する場合

この記事の執筆時のMySQL8系ではデフォルト認証方式が `caching_sha2_password` に変更されています。
PHPのMySQL接続ライブラリが対応していない問題があり、元の認証方式である `mysql_native_password` に設定する必要があります。

詳しい内容は過去の記事 [MySQL8.0 認証方式を変更する](https://qiita.com/ucan-lab/items/3ae911b7e13287a5b917) を参照ください。

`~/work/laradock/mysql/my.cnf` ファイルの `[mysqld]` セクションに追記します。

```
# The MySQL  Client configuration file.
#
# For explanations see
# http://dev.mysql.com/doc/mysql/en/server-system-variables.html

[mysql]

[mysqld]
sql-mode="STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION"
character-set-server=utf8

# 追記
default-authentication-plugin=mysql_native_password
```

## Docker環境の構築

```
$ docker-compose up -d nginx mysql workspace phpmyadmin

...
Creating laradock_mysql_1            ... done
Creating laradock_docker-in-docker_1 ... done
Creating laradock_workspace_1        ... done
Creating laradock_phpmyadmin_1       ... done
Creating laradock_php-fpm_1          ... done
Creating laradock_nginx_1            ... done
```

最終的に、上記のようにコンテナが作成完了すればokです。

ここでコンテナを指定しないで `docker-compose up -d` とするとLaradockで定義されている全てのコンテナが構築されてしまいます。
これは相当な時間がかかるので、必要最小限のコンテナを指定します。
あと、通信量も多いのでモバイルルーターやテザリング、ネットワーク弱い場所では注意してください。

### Docker環境のバージョン

```
$ docker-compose run workspace php -v
Starting laradock_docker-in-docker_1 ... done
PHP 7.2.4-1+ubuntu16.04.1+deb.sury.org+1 (cli) (built: Apr  5 2018 08:53:57) ( NTS )
Copyright (c) 1997-2018 The PHP Group
Zend Engine v3.2.0, Copyright (c) 1998-2018 Zend Technologies
    with Zend OPcache v7.2.4-1+ubuntu16.04.1+deb.sury.org+1, Copyright (c) 1999-2018, byZend Technologies

$ docker-compose run nginx nginx -v
nginx version: nginx/1.15.7

$ docker-compose run mysql mysql -V
mysql  Ver 8.0.13 for Linux on x86_64 (MySQL Community Server - GPL)
```

※執筆時点のバージョンです

## Laravelプロジェクトの作成

```
$ docker-compose exec --user=laradock workspace bash
$ composer create-project laravel/laravel sampleapp --prefer-dist "5.5.*"
$ exit
```

## Laradockの環境設定ファイルを変更

`.env`

```
APP_CODE_PATH_HOST=../sampleapp
```

サンプルアプリの場所を指定します。

### docker 再起動

Laradockの `.env` を変更した場合、反映させるためにdockerの再起動が必要です。

```
$ docker-compose stop
$ docker-compose up -d nginx mysql
```

## Laravel Welcomeページを表示する

ここまで設定ができてれいれば、Laravelのウェルカムページが表示できるようになっています。

http://localhost

![https://i.gyazo.com/ea78a7d72c1ce18067dfcecb811283e1.png](https://i.gyazo.com/ea78a7d72c1ce18067dfcecb811283e1.png)

## Laradock MySQLコンテナ

### MySQL接続情報

- データベース: default
- ユーザー名: default
- パスワード: secret
- rootユーザーのパスワード: root

## Laravel MySQL接続設定

workspaceコンテナに入り、Laravelの `.env` ファイルを変更します。

```
$ docker-compose exec --user=laradock workspace bash
```

`.env` ファイルのデータベース設定項目を下記の設定に書き換えます。

```
DB_CONNECTION=mysql
DB_HOST=mysql # 変更
DB_PORT=3306
DB_DATABASE=default # 変更
DB_USERNAME=default # 変更
DB_PASSWORD=secret
```

`DB_HOST=mysql` ホスト名でmysqlコンテナを指定します。

```
$ php artisan migrate
Migrating: 2014_10_12_000000_create_users_table
Migrated:  2014_10_12_000000_create_users_table
Migrating: 2014_10_12_100000_create_password_resets_table
Migrated:  2014_10_12_100000_create_password_resets_table
```

上記のようにマイグレーションが実行できていればokです。

## 補足

### MySQL認証方式の確認

mysqlコンテナにログイン、MySQLにログインして認証方式を表示するSELECT文を実行する。

```
$ docker-compose exec mysql bash
$ mysql -uroot -proot
> SELECT user, host, plugin FROM mysql.user;
+------------------+-----------+-----------------------+
| user             | host      | plugin                |
+------------------+-----------+-----------------------+
| default          | %         | mysql_native_password |
| root             | %         | mysql_native_password |
| mysql.infoschema | localhost | caching_sha2_password |
| mysql.session    | localhost | caching_sha2_password |
| mysql.sys        | localhost | caching_sha2_password |
| root             | localhost | mysql_native_password |
+------------------+-----------+-----------------------+
```

defaultユーザーのpluginが `mysql_native_password` となっていればokです。

### あとから認証方式を変更する(my.cnf)

`my.cnf` の追記を忘れた場合は、mysqlコンテナの再ビルドが必要です。
`~/.laradock/data` にMySQLのデータが格納されるのでここも破棄しないと変更が反映されません。今回は `~/.laradock` ごと削除します。

```
# my.cnfを修正しておく
$ docker-compose stop
$ rm -rf ~/.laradock
$ docker-compose up -d --build mysql
```

MySQL認証方式が変更されているか確認しましょう。
`~/.laradock` を削除するとテーブル

### あとから認証方式を変更する(SQL)

SQLを実行して認証方式を変更してもokです。

```
$ docker-compose exec mysql bash
$ mysql -uroot -proot
> ALTER USER 'default'@'%' IDENTIFIED WITH mysql_native_password BY 'secret';
> SELECT user, host, plugin FROM mysql.user;
+------------------+-----------+-----------------------+
| user             | host      | plugin                |
+------------------+-----------+-----------------------+
| default          | %         | mysql_native_password |
| root             | %         | caching_sha2_password |
| mysql.infoschema | localhost | caching_sha2_password |
| mysql.session    | localhost | caching_sha2_password |
| mysql.sys        | localhost | caching_sha2_password |
| root             | localhost | caching_sha2_password |
+------------------+-----------+-----------------------+
```

### Sequel Pro(MySQL8.0)

執筆時のSequel Pro最新バージョン1.1.2はMySQL8.0に対応していません。
バージョン1.2でMySQL8.0に対応予定です。

Sequel Proを使いたい場合は MySQL5.7 へダウングレードする必要があります。
下記を参照ください。

- http://laradock.io/documentation/#change-the-mysql-version
- https://github.com/sequelpro/sequelpro/issues/2699

### MySQL5.7にダウングレードする

最終的にはSequel Proも使えるし、MySQL5.7にダウングレードした方が開発しやすいです。

`laradock/.env` を変更する

```
### MYSQL #################################################

#MYSQL_VERSION=latest
MYSQL_VERSION=5.7
```

MySQLのバージョンを最新(latest)から5.7に変更する

```
$ docker-compose stop
$ rm -rf ~/.laradock
$ docker-compose up -d --build mysql
$ docker-compose exec mysql bash
# mysql --version
mysql  Ver 14.14 Distrib 5.7.24, for Linux (x86_64) using  EditLine wrapper
```

### nginxのポート番号を変更する

80ポートが他のアプリで使用している場合、エラーになってしまいます。
`laradock/.env` ファイルでポート変更できます。
**必ずしも変更する必要はありません。**

```
### NGINX #################################################

#NGINX_HOST_HTTP_PORT=80
NGINX_HOST_HTTP_PORT=8888
```

nginxのポート番号を `80` => `8888` など任意のポート番号に変更します。

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

http://localhost:8888

![https://i.gyazo.com/ea78a7d72c1ce18067dfcecb811283e1.png](https://i.gyazo.com/ea78a7d72c1ce18067dfcecb811283e1.png)

8888ポート番号を指定してブラウザからアクセスし、LaravelのWelcome画面が表示されていればokです。

### Tableplusでログインする

<img width="500" alt="スクリーンショット 2019-05-06 23.50.07.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/52879/744f6ad0-79f3-311e-ddd1-ea135670e909.png">

- Name: `laradock` 任意
- Ver: `MySQL 8.x`
- User: `default`
- Password: `secret`

あとは初期値のままで `Connect` からログインする。

### PHPMyAdminでログインする

http://127.0.0.1:8080

<img width="507" alt="スクリーンショット 2019-05-06 23.45.26.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/52879/d13bf79a-7426-5c64-c4b1-922c00c60101.png">

- サーバ: `mysql`
- ユーザ名: `default`
- パスワード: `secret`