LaradockにMySQL8(latest)を入れるとエラーで落ちたので、その時の対処法

多くの先人の方の知恵により解決しました。
今回はそのまとめのまとめみたいになります。
引用方法には気をつけておりますが、
間違いや抜けがありましたらご指摘いただければ修正いたします。
その他、「こうしたほうがいいよ」や「今はこうやってやるよ」、
MySQLのセキュリティノートまで追えてないのでセキュリティ面など、
コメントで追加していただけると幸いです。

# やりたいこと
Laradockを取得後、workspaceコンテナからmysqlコンテナへ接続する

# 手順
かなりはぶきます。

1, [Laradock](https://laradock.io/getting-started/#2-2-installation)のインストール

- A.2) Don’t have a PHP project yet: からスタートし、2 まで実行

2, ローカルにLaravelを取ってくる

```
$ composer create-project --prefer-dist laravel/laravel blog
```

3, Laradock/.env の書き換え

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

MYSQL_VERSION=8.0        <= 適宜変えてください。今回はバージョンを指定します
MYSQL_DATABASE=blog_db   <= お好きなDB名を
MYSQL_USER=administer    <= それっぽいユーザー名
MYSQL_PASSWORD=blog12345 <= 便宜上簡易的にしてます
MYSQL_PORT=3306          <= 他に使っていなければこのままで
MYSQL_ROOT_PASSWORD=root <= ここは便宜上にrootにしています。デフォルトでもOKかと
MYSQL_ENTRYPOINT_INITDB=./mysql/docker-entrypoint-initdb.d

```

4, laradock/mysql/my.confに以下を追加

```
default_authentication_plugin= mysql_native_password
```

5, blog/.env の書き換え

```
DB_CONNECTION=mysql    <= PDOは勝手に入れてくれるのでこのように変更
DB_HOST=mysql          <= docker内部でリンク(? 的なものを作ってくれるようなのでこの名前で
DB_PORT=3306           <= 他に使っていなければこのままで
DB_DATABASE=blog_db    <= 3と合わせる
DB_USERNAME=administer <= 3と合わせる
DB_PASSWORD=blog12345  <= 3と合わせる
```

6, docker-compose up してひたすら待つ

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

最低限だけ入れてます

7, 終わったらworkspaceに入る

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

8, blog/ 以下で php artisan migrate コマンドを実行

うまくいけばOK

ダメなら下へ

ちなみに私は下のようなエラーが出ました。

# 現象

```
   Illuminate\Database\QueryException  : SQLSTATE[HY000] [2054] The server requested authentication method unknown to the client (SQL: select * from information_schema.tables where table_schema = coporeate and table_name = migrations and table_type = 'BASE TABLE')

  at /var/www/coporate/vendor/laravel/framework/src/Illuminate/Database/Connection.php:664
    660|         // If an exception occurs when attempting to run a query, we'll format the error
    661|         // message to include the bindings with SQL, which will make this exception a
    662|         // lot more helpful to the developer instead of just the database's errors.
    663|         catch (Exception $e) {
  > 664|             throw new QueryException(
    665|                 $query, $this->prepareBindings($bindings), $e
    666|             );
    667|         }
    668|

  Exception trace:

  1   PDOException::("PDO::__construct(): The server requested authentication method unknown to the client [caching_sha2_password]")
      /var/www/coporate/vendor/laravel/framework/src/Illuminate/Database/Connectors/Connector.php:70

  2   PDO::__construct("mysql:host=mysql;port=3306;dbname=coporeate", "admin", "admin0401", [])
      /var/www/coporate/vendor/laravel/framework/src/Illuminate/Database/Connectors/Connector.php:70

  Please use the argument -v to see more details.
```

- [MySQL 8.0.4におけるデフォルト認証形式の変更](https://yoku0825.blogspot.com/2018/01/mysql-804.html)
- [【Docker】MySQL8.0系を使う時に発生する問題について](https://blog.websandbag.com/entry/2018/05/17/121730)
- [【Docker】LaravelでMySQL8.0を使う](https://blog.websandbag.com/entry/2019/06/02/005905)

上のURLを参考に作業します。

9, 一旦、workspaceから抜けて、mysql コンテナへ

```
$ docker-compose exec mysql bash
```

10, mysqlへroot権限でログインして、ユーザー権限の付与とパスワード形式の変更、DBへのアクセス権を付与します.

```
$ mysql -u root -p 
$ password: root <= ここは3で指定したものを使います

mysql > ALTER USER administer IDENTIFIED WITH mysql_native_password;
mysql > ALTER USER 'administer'@'%' identified mysql_native_password BY 'blog12345';
mysql > GRANT ALL ON `blog_db`.* TO 'administer'@'%' ;
mysql > GRANT ALL ON `blog_db`.* TO 'administer'@'localhost' ;
mysql > FLUSH PRIVILEGES ;
```

11, mysqlのコンテナを抜けて、再度workspaceコンテナに入り、blog/ 以下でコマンドを実行

```
php artisan migrate
```

```
Migration table created successfully.
Migrating: 2014_10_12_000000_create_users_table
Migrated:  2014_10_12_000000_create_users_table (0.05 seconds)
Migrating: 2014_10_12_100000_create_password_resets_table
Migrated:  2014_10_12_100000_create_password_resets_table (0.04 seconds)
```

このような形でできればOK

# 所感
MySQL8.0.4からセキュリティを厳密にしましょうということで、caching_sha2_passwordをデフォルトにしているために発生したエラーです。 10番の内容をmysqlのdocker.ymlに記載したのですが、読み込んでくれなかったので、今回は直接変更しました。調べてみるとdokcer-compose up 時にMySQLの権限周りもやってくれそうな感じはしたので、試してみるつもりです。

以上となります。

何かの参考になれば幸いです。