最近はローカル環境でミドルウェアを使う時、直接インストールするのではなくDockerで立てることもよくあると思います。
今回はMySQLをDockerでローカルに起動し使う時の、ちょっとした注意点を紹介します。
Docerイメージから起動したMySQLにログインできない
まず、下記のコマンドでDockerでMySQLを起動してください(Dockerが入っていない場合は先にインストールしてください)。
$ docker container run --rm -d -e MYSQL_ROOT_PASSWORD=mysql -p 3306:3306 --name mysql mysql
バージョンの指定をしていないため、最新のバージョンでコンテナが起動します。
すると下記のエラーが発生する場合があります。
$ mysql -h 127.0.0.1 -P 3306 -u root -p ERROR 2059 (HY000): Authentication plugin ‘caching_sha2_password’ cannot be loaded: dlopen(/usr/local/Cellar/mysql/5.7.17/lib/plugin/caching_sha2_password.so, 2): image not found
ローカルのMySQLとのバージョン差異で発生する
原因としてはローカルのMySQLクライアントのバージョンが古いから。
$ mysql --version mysql Ver 14.14 Distrib 5.7.17, for osx10.12 (x86_64) using EditLine wrapper
普段あまり意識することもないですが、MySQLにはサーバー(データが読み書きされるデータベースそのもの)とクライアント(サーバーに接続してデータベースを操作するもの)があります。
なので mysql
コマンドはあくまでMySQLへ接続するためのクライアントです。
PCにMySQLをインストールすると両方がセットで入ってきます。
そして今回のパターンで厄介なのは、
- サーバー ・・・ Dockerイメージから起動したコンテナ上のMySQLサーバー
- クライアント ・・・ ローカルにインストールしたMySQLに含まれるクライアント
となるので、バージョンに差異が出る場合があります。
これは外部サーバーにあるMySQLに対して接続する場合も同様です。
今回の場合でいうと
- Docker上のMySQLサーバー・・・8.0
- ローカルのMySQLクライアント・・・5.7
となっていました。
MySQL8.0からデフォルトの認証プラグインが変わった
とは言ってもMySQL5系の中でのバージョン差異があっても基本的に問題はありません。
これまでも特にここを意識したことはなかったです。
問題は8系になってから、MySQLのデフォルトの認証プラグインが変わった点です。
- 5系まで・・・
mysql_native_password
- 8系から・・・
caching_sha2_password
となっています。
セキュリティ強化の観点で変わったらしいです。
そしてサーバーとクライアントで使っている認証プラグインが違うと、前述のエラーが発生してログインできなくなります。
これが今回Docker上のMySQLサーバーが8.0、ローカルのMySQLクライアントが5.7になっていたことで起きた問題です。
クライアントのバージョンを上げる
対応策として一番簡単なのは、ローカルのMySQLのバージョンを上げてしまうことです。
DockerでMySQLを立ち上げている方は恐らくそちらを使うことがメインだと思うので、あえてローカルのバージョンを古いまま残しておく理由も少ないでしょう。
例:Macの場合(Homebrew)
$ brew upgrade mysql
これでログインできるようになります。
$ mysql -h 127.0.0.1 -P 3306 -u root -p
同様の理由でSequel Proが使えない
こちらは同じ問題にハマっている人はよく見かけるんですが、Sequel ProからMySQLにアクセスできません。
これはSequel Proの認証プラグインが mysql_native_password
になっているためです。
下記の記事などで対応策が紹介されています。
Sequel Proでアクセスするユーザーの認証プラグインを mysql_native_password
に変えてしまうことでアクセスできるようにする手はあるみたいですが、ここはSequel Pro側に頑張って欲しいところですね・・・
最新バージョンのMySQLに通常だとアクセスできないという問題が放置されているようだと、他のツールに乗り換えた方がいいのかなという気持ちになってきました。