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を使って変更することができます。