LaradockでLaravel環境を構築する流れとMySQL接続について

#LaradockでMySQLに接続したい！！
Laradockでlaravelの開発環境を構築する方法については、公式ドキュメントや多くのQiitaの記事で説明されており、基本的にはそれに従って行けば開発環境を立ち上げることができると思います。しかし、自分が公式ドキュメントや記事通りに作業していく中でハマった点が２つあり、その解決法を探すのに時間がかかったので、ハマった点とその対処法について記録を残しておくものです
#ハマった点
###1 MySQLのバージョンについて
MySQLの認証方法がLaravelにサポートされてないのでエラーが出る。
MySQL 8.0.4からデフォルトの認証方式が変わり、セキュリティが強化されました。しかし、Laravel側でサポートされていないためphp artisan migrateを打っても「The server requested authentication method unknown to the client」というエラーが出ます
###2 .envの編集について
Laradock,Laravelの.envの編集すれば良いか、MySQLのユーザー登録をどのようにすれば良いかがわからない

#１　Laradockのインストール、env編集
今回はこのようなディレクトリ構造で作業を行なっていきます

- (root)
    - sampleapp
        - Laradock(Laradock側)
        - Laravel 
            - wikiLearns(Laravel側)
            
まずは公式ドキュメント通り

```
$ git clone https://github.com/laradock/laradock.git
$ cd laradock
$ cp env-example .env
```

ここで.envファイルを編集します

```laradock.env
### MYSQL ################################################

MYSQL_VERSION=5.7 //latest
MYSQL_DATABASE=default
MYSQL_USER=default
MYSQL_PASSWORD=secret
MYSQL_PORT=3306
MYSQL_ROOT_PASSWORD=root
MYSQL_ENTRYPOINT_INITDB=./mysql/docker-entrypoint-initdb.d
```
MySQLのバージョンをlatestから5.7にしました
なのでハマった点１の答えは「認証方法変更前のMySQL5.7を使おう」です。現在インストールしているMySQLも8.0.4 -> 5.7に変更しました

それともう一つ

```laradock.env
### NGINX ################################################

NGINX_HOST_HTTP_PORT=8888 // 80
NGINX_HOST_HTTPS_PORT=443
NGINX_HOST_LOG_PATH=./logs/nginx/
NGINX_SITES_PATH=./nginx/sites/
NGINX_PHP_UPSTREAM_CONTAINER=php-fpm
NGINX_PHP_UPSTREAM_PORT=9000
NGINX_SSL_PATH=./nginx/ssl/
```
NGINXのポート番号を80 -> 8888に変更しました
Apacheのポート番号とダブらないようにするためです
#2 コンテナの起動
コンテナを起動します

```
docker-compose up -d nginx mysql phpmyadmin
```
ここで8.0 -> 5.7にバージョンを変えた場合、MySQLのコンテナだけ起動されないという不具合が発生します。その時はDATA_PATH_HOSTで設定したフォルダを綺麗にして、イメージを作成し直す必要があります

対処法
①　パス確認
　　$ cat .env | grep DATA_PATH_HOST
　　自分の場合は　DATA_PATH_HOST=~/.laradock/data　が表示されました
②　パス、イメージ、コンテナを消去
　　rm -rf ~/.laradock/data/mysql
　　docker rmi laradock_mysql -f
　　docker rmi mysql -f
③　mysqlをビルドし直し
　　docker-compose build --no-cache mysql
④　docker ps でちゃんと動いているか確認しましょう

#3　Laravelプロジェクトの作成
workspaceに入って

```
$ docker exec -it laradock_workspace_1 bash
```

Laravelプロジェクトの作成
生成後、sampleapp/Laravel/wikiLearns 内にディレクトリwikiLearnsが出来るので、これをsample/Laravelに置き直してください（何かここ方法があるはず）

```
# composer create-project laravel/laravel wikiLearns(任意のアプリ名)
```

workspaceから出ます

```
# exit
```

設定の変更をするために一時停止

```
$ docker-compose stop
```

APP_CODE_PATH_HOST=../をAPP_CODE_PATH_HOST=../laravel/wikiLearns(自分の作ったディレクトリに対するLaradock起点での任意のパス)に書き換えてください

```laradock.env
APP_CODE_PATH_HOST=../laravel/wikiLearns // ../
```

コンテナ再起動

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

ブラウザでhttp://localhost:8888/ につなぐと例の画面が出てくるはずです。（出てこない場合は多分APP_CODE_PATH_HOSTのパス間違い）

#4 MySQLへの接続
ハマった点２の説明です

LaradockのMySQLに接続したい時、

```Laravel.env
DB_CONNECTION=mysql
DB_HOST=mysql // 127.0.0.1
DB_PORT=3306
DB_DATABASE=wikiLearns
DB_USERNAME=homestead
DB_PASSWORD=secret
```

LaravelのDB_HOSTを127.0.0.1 -> mysqlに変更すれば接続できるはず...なんですが、PDOException::("SQLSTATE[HY000] [2002] Connection refused")が出てきます。このエラーはMySQLに認証されていないユーザーで接続しようとした時に発生します。MySQLのコンテナに入って新たにユーザー生成しましょう

###1 ユーザー生成
「laradockのworkspaceコンテナからmysqlコンテナに接続」します。そうするとworkspaceからMySQLに接続してマイグレーション等ができるようになります
まずdocker inspectでworkspaceのIPアドレスを確認しましょう

```
$ docker-compose up -d nginx mysql
$ docker ps （これでworkspaceのコンテナIDを見られる）
$ docker inspect be68295513a3(workspaceのIPアドレス)
```

下の方にIPアドレスが書いてあります

```
"Gateway": "172.20.0.1",
"IPAddress": "172.20.0.3", <- これ
"IPPrefixLen": 16,
"IPv6Gateway": "",
"GlobalIPv6Address": "",
"GlobalIPv6PrefixLen": 0,
"MacAddress": "02:42:ac:14:00:03",
"DriverOpts": null
```

MySQLコンテナに入ります

```
$ docker-compose exec mysql bash
# mysql -u root -p
# （パスワードはLaradockの.envのMYSQL_ROOT_PASSWORDを見る
    デフォルトはroot）
```

データベースを作成

```
> create database wikiLearns(任意の名前);
```

ユーザー作成


```
> create user 'root（任意の名前）'@'172.20.0.3（workspaceのIPアドレス）'identified by 'secret（任意のパスワード）';
> grant all privileges on . to 'root'@'172.20.0.3';
```

###2 .env編集 
MySQLを出てLaradock、Laravelの.env編集


```laradock.env
MYSQL_VERSION=5.7
MYSQL_DATABASE=wikiLearns（作ったデータベース名）
MYSQL_USER=root（作ったユーザー名）
MYSQL_PASSWORD=secret（設定したパスワード）
MYSQL_PORT=3306
MYSQL_ROOT_PASSWORD=root
MYSQL_ENTRYPOINT_INITDB=./mysql/docker-entrypoint-initdb.d
```

```Laravel.env
DB_CONNECTION=mysql
DB_HOST=mysql // 127.0.0.1 → mysql
DB_PORT=3306
DB_DATABASE=dockapp（Laradockと同じに)
DB_USERNAME=root（Laradockと同じに）
DB_PASSWORD=secret（Laradockと同じに）
```

dockerを停止して再起動すればマイグレーションができます

```
$ docker-compose up -d nginx mysql
$ docker exec -it laradock_workspace_1 /bin/bash
$ php artisan migrate
```

これでdockerコンテナを立ち上げてlaravelを利用できるようになりました