MySQL8系から5系に戻す方法  (Docker環境構築でLaravelを構築)

#はじめに

＊PHP 7.1.16 または PHP 7.2.4 以降のバージョンの場合、caching_sha2_password に対応しているため本記事の処理は必要ありません。
(コメントでご指摘いただきありがとうございます。)

2019年以降(?)、LaradockでDockerを環境構築するとMySQL８系がインストールされると思います。

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

MYSQL_VERSION=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
```

しかし、MySQL8系から認証方式が変更になり、接続エラーが発生してしまいます。
原因として、PHPのMySQL接続ライブラリがcaching_sha2_passwordに対応してないためです。

対応方法として、認証方式をmysql_native_passwordに変更すれば解決するらしいのですが、私の場合うまく解決できず接続不可のまま環境構築に躓いてしまいました。

そこで、MySQLを5.7にダウングレードして環境構築し直したので、流れを共有したいと思います。

#MySQLを5.7にダウングレードする
それではMySQLを変更していきましょう。
MYSQL_VERSIONをlatestから5.7へ変更します。


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

MYSQL_VERSION=5.7  //ここを変更する
MYSQL_DATABASE=default
MYSQL_USER=default
MYSQL_PASSWORD=secret
MYSQL_PORT=3306
MYSQL_ROOT_PASSWORD=root
MYSQL_ENTRYPOINT_INITDB=./mysql/docker-entrypoint-initdb.d
```


コンテナを停止し、status が Exit になっているのを確認

```
$ docker-compose stop

 Name                          Command                State     Ports
-------------------------------------------------------------------------------
laradock_apache2_1            /opt/docker/bin/entrypoint ...   Exit 128        
laradock_docker-in-docker_1   dockerd-entrypoint.sh            Exit 0          
laradock_mysql_1              docker-entrypoint.sh mysqld      Exit 0          
laradock_nginx_1              /bin/bash /opt/startup.sh        Exit 137        
laradock_php-fpm_1            docker-php-entrypoint php-fpm    Exit 0          
laradock_redis_1              docker-entrypoint.sh redis ...   Exit 0          
laradock_workspace_1          /sbin/my_init                    Exit 0   
```

mysqlのコンテナを削除

```
$ docker ps -a
CONTAINER ID        IMAGE                COMMAND                  CREATED             STATUS              PORTS                                              NAMES
3e8e9df26374        laradock_nginx       "/bin/bash /opt/star…"   4 days ago          Up 4 days           0.0.0.0:80->80/tcp, 0.0.0.0:443->443/tcp, 81/tcp   laradock_nginx_1
ebad8dba22ba        laradock_php-fpm     "docker-php-entrypoi…"   4 days ago          Up 4 days           9000/tcp                                           laradock_php-fpm_1
3acd82e5769d        laradock_workspace   "/sbin/my_init"          4 days ago          Up 4 days           0.0.0.0:2222->22/tcp                               laradock_workspace_1
de9a3a20ce4c        docker:dind          "dockerd-entrypoint.…"   4 days ago          Up 4 days           2375-2376/tcp                                      laradock_docker-in-docker_1
da337541d65e        laradock_mysql       "docker-entrypoint.s…"   4 days ago          Up 4 days           0.0.0.0:3306->3306/tcp, 33060/tcp                  laradock_mysql_1
5ff300a02cfd        laradock_redis       "docker-entrypoint.s…"   4 days ago          Up 4 days           0.0.0.0:6379->6379/tcp                             laradock_redis_1
910be240faa2        laradock_apache2     "/opt/docker/bin/ent…"   4 days ago          Created                                                                laradock_apache2_1

$ docker rm コンテナID（mysql）  //ここではCONTAINER IDの「da337541d65e」が該当します。
```

コンテナイメージを削除する
イメージを削除するかどうかの確認文が出たら y でenter

```
$ cat .env | grep DATA_PATH_HOST

DATA_PATH_HOST=~/.laradock/data  // 表示内容はlaradock.envの設定で個人差あります

$ rm -rf ~/.laradock/data
$ docker images
$ docker rmi イメージID(laradock_mysql) -f

キャッシュ消してビルド
$ docker-compose build --no-cache mysql
```

status が up か確認
mysql のバージョンが5.7系になっていればOK

```
$ docker ps -a
$ docker-composer exec mysql mysql --version
```

これでMySQLが5.7に変更できているはずです！！