DockerとLaradockでPHPフレームワークとCMSの開発環境を構築する【MySQL（ latest）8.0.11対応】

初めまして。Qiitaでの初回投稿になりますが、よろしくお願いします。

DockerとLaradockでPHPフレームワークとCMSの開発環境を構築します。Dockerでの開発環境構築を勉強するために参考情報を調べていたらLaradockという便利そうなものを見つけました。

> Composerが入ってるだけだから別のフレームワークでも使える
[PHPカンファレンス関西2017に行ってきました \| プログラミングメカブログ](http://blog.mekachan.net/?p=489)

と言う記事も見かけたので、以下のPHPフレームワークとCMSの開発環境をDockerとLaradockを利用して用意してみようと思います。

### 今回実施するもの
#### PHPフレームワーク
- [Laravel](https://laravel.com/)【今回】
- [CakePHP](https://cakephp.org/jp)

#### CMS
- [WordPress](https://ja.wordpress.org/)
- [Drupal](http://drupal.jp/)
- [baserCMS](https://basercms.net/)

### mysqlバージョンについて
以下の記事を参考に[ my.cnf ]に[ default_authentication_plugin=mysql_native_password ]を追記しlatest（8.0.11）に対応しました。
参考：[日々の覚書: MySQL 8\.0\.4におけるデフォルト認証形式の変更](https://yoku0825.blogspot.com/2018/01/mysql-804.html)

~~mysqlのデフォルトの認証方式がバージョン8.0.4から[ caching_sha2_password ] に変更があったため、latestバージョン（8.0.11）でPHPフレームワークやCMSの開発環境構築を進めて行こうとすると以下のようなエラーが発生します。~~

```
#エラー内容
SQLSTATE[HY000] [2054] The server requested authentication method unknown to the client
PDOException::("PDO::__construct(): The server requested authentication method unknown to the client [caching_sha2_password]")
PDO::__construct("mysql:host=mysql;port=3306;dbname=default", "default", "secret", [])
```

参考：[SQLSTATE\[HY000\] \[2054\] The server requested authentication method unknown to the client · Issue \#1392 · laradock/laradock](https://github.com/laradock/laradock/issues/1392)

~~エラー解消の参考情報は見つけたのですが、個人的にmysqlはバージョン8.0.3または5.7.22で問題ないため、latestバージョン（8.0.11）は使用しないことに決めました。~~

### バージョン情報
- Mac OS 10.11.6（El Capitan）
- Docker Toolbox
  - Docker version 18.03.0-ce
  - Oracle VM VirtualBox Manager 5.2.12
- [Laradock](http://laradock.io/)
  - PHP 7.2.4 (fpm-fcgi) 
  - nginx version: nginx/1.15.0
  - mysql Ver 8.0.11 for Linux on x86_64 (MySQL Community Server - GPL)
- [Laravel 5.6.26](https://laravel.com/)

#### その他情報
- github:[2no553/laravel\_laradock](https://github.com/2no553/laravel_laradock)
- blog:[DockerとLaradockでPHPフレームワークとCMSの開発環境を構築する – Ninolog](https://ninolog.com/docker-build-php-from-laradock/)


### laradock設定
起動するコンテナ群の環境変数設定ファイル作成し、laradock設定を行います。

```
$ git clone https://github.com/Laradock/laradock.git
$ cd laradock

#コンテナ群の環境変数設定ファイル作成
$ cp env-example .env
```

[ .env ]の[ Paths ]でPHPフレームワークやCMSを展開するディレクトリや、DBデータの永続場所が指定できますので必要に応じて変更して下さい。

```
APP_CODE_PATH_HOST=../
DATA_PATH_HOST=~/.laradock/data
```

#### mysql latest設定
mysqlバージョンlatest(8.0.11)に合わせて設定を変更します。

```
$ vi docker-compose.yml
  ports:
    - "${MYSQL_PORT}:3306"
  networks:
    - backend
+ user: "1000:50"

$ vi mysql/my.cnf
+ innodb_use_native_aio=0
+ default_authentication_plugin=mysql_native_password
```

### コンテナ起動確認
[ .env ]と[ docker-compose.yml ] の設定を元にコンテナを生成起動します。

```
$ docker-compose up -d nginx mysql
$ docker-compose ps
           Name                          Command              State                   Ports                 
------------------------------------------------------------------------------------------------------------
laradock_docker-in-docker_1   dockerd-entrypoint.sh           Up      2375/tcp                              
laradock_mysql_1              docker-entrypoint.sh mysqld     Up      0.0.0.0:3306->3306/tcp                
laradock_nginx_1              nginx                           Up      0.0.0.0:443->443/tcp,                 
                                                                      0.0.0.0:80->80/tcp                    
laradock_php-fpm_1            docker-php-entrypoint php-fpm   Up      9000/tcp                              
laradock_workspace_1          /sbin/my_init                   Up      0.0.0.0:2222->22/tcp 
```

### workspaceコンテナ接続
PHPフレームワークやCMSをインストールするため[ workspace ]コンテナに接続します。
[ root@98cc6b1b406d:/var/www# ]のような表示がされたら接続は成功です。

```
$ docker-compose exec workspace bash
```

### PHPフレームワークやCMSをインストール
Laradockの準備ができたのでworkspaceコンテナにPHPフレームワークやCMSをインストールしていきます。例としてLaravelのみ紹介します。

#### Laravel設定
[ composer ]でインストールし、nginxの[ default.conf ]内のrootのpathを修正します。

```
# composer create-project laravel/laravel app-name --prefer-dist
$ exit

$ vi nginx/sites/default.conf
- root /var/www/public;
+ root /var/www/app-name/public;

$ docker-compose restart nginx
```

#### Laravelスタートページ表示
```
http://192.168.99.100/
```

#### migrationテスト
```
$ docker-compose exec workspace bash
# cd app-name
# vi .env
- DB_HOST=127.0.0.1
- DB_DATABASE=homestead
- DB_USERNAME=homestead
+ DB_HOST=mysql
+ DB_DATABASE=default
+ DB_USERNAME=default

# php artisan migrate:status
# php artisan migrate
```

##### 参考
- [mysqld: Can't create/write to file '/var/lib/mysql/is\_writable' \(Errcode: 13 \- Permission denied\) · Issue \#219 · docker\-library/mysql](https://github.com/docker-library/mysql/issues/219)
- [Mysql container working on Docker v17\.12\.0 but not on v18\.01\.0 · Issue \#1584 · docker/for\-win](https://github.com/docker/for-win/issues/1584)
- [MySQL Container fails to start · Issue \#1492 · laradock/laradock](https://github.com/laradock/laradock/issues/1492)
- [日々の覚書: MySQL 8\.0\.4におけるデフォルト認証形式の変更](https://yoku0825.blogspot.com/2018/01/mysql-804.html)