タケハタのブログ

プログラマの生き方、働き方、技術について雑多に書いていくブログです。

DockerでMySQLを起動した時はバージョン差異に注意

最近はローカル環境でミドルウェアを使う時、直接インストールするのではなく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のデフォルトの認証プラグインが変わった点です。

dev.mysql.com

  • 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 になっているためです。

下記の記事などで対応策が紹介されています。

qiita.com

Sequel Proでアクセスするユーザーの認証プラグインを mysql_native_password に変えてしまうことでアクセスできるようにする手はあるみたいですが、ここはSequel Pro側に頑張って欲しいところですね・・・

最新バージョンのMySQLに通常だとアクセスできないという問題が放置されているようだと、他のツールに乗り換えた方がいいのかなという気持ちになってきました。