Dockerを使うと、既存の環境を変更せずに、様々なサービスを動作させることができます。Dockerがどのようなものか、については、解説しているページが山ほどあるので、ここでは省略します。Wikipediaのページなどを参照してください。

MySQLデータベースを使うアプリケーションのテスト用にMySQLのDockerイメージを利用したのですが、ハマってしまったことがあったので、ここで紹介しておきます。同じようなことでハマってしまった方の助けになることを祈って。

作成したユーザーでログインできない

MySQLを利用するには、ユーザーを作成する必要があります。rootで使うという手もあり、テスト環境であればそれでも十分ではあるのですが。しかし、お作法でもあるので、全権限を持ったユーザーを新しく作成して(それはrootなのではないかというツッコミはご遠慮願います)、そのユーザーを使ってアプリケーションのテストコードを走らせることにしました。

しかし、そのユーザーでログインすることができません。Access Diniedでエラーになってしまい、MySQLデータベースに接続することができないのです。

Dockerの設定に問題があったのかと、いろいろなページを検索して探し、あれこれと試してみたのですが、エラーは変わりません。rootでの接続は問題なくでき、作成したユーザーはシステムテーブル上でも確認できます。ログインできないはずがないのだけれど、と悩んでいました。

そして、ふと思いついたのが、アクセス許可するホストの項目。ここを試しに無制限に変更してみたところ、あっさりとログインできるようになりました。

Dockerは仮想マシンを立ち上げるため、MySQLが動作するホストとは別のコンピューターからログインしている、という扱いになるのでした。ホストをlocalhostに制限していると、Dockerの仮想マシンからしかログインできない、ということになります。

ユーザー情報を変更するSQLは、以下のように書きます。ユーザーのホスト情報を、localhostから%に変更します。

RENAME USER 'user'@'localhost' TO 'user'@'%';

データベースの操作にはHeidiSQLを使っているのですが、HeidiSQLではGUIを使って変更することができます。