はじめに
環境構築でDockerのコンテナで遭遇したエラーを共有します。
問題
環境構築で次のコマンドを実行したところ、MySQLの接続に失敗しました。
docker-compose up -d
docker-compose run --rm db bash
mysql -u root -p
ERROR 2002 (HY000): Can't connect to local MySQL server through socket '/var/run/mysqld/mysqld.sock
解決方法
問題の解決に docker-compose exec コマンドを使用しました。このコマンドは既に稼働しているコンテナ内でシェルを開きます。
docker-compose exec db bash
mysql -u root -p
この方法は、既に起動しているMySQLサーバーのコンテナ内でコマンドを実行するので、MySQLクライアントが正しいソケットに接続することができます。正常に接続できた場合、次のような成功メッセージが表示されます。
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 14
Server version: 5.7.19 MySQL Community Server (GPL)
原因
docker-compose run コマンドは、新しいコンテナを起動し、その中で指定したコマンドを実行します。この新しいコンテナは、既存のMySQLサーバーコンテナとは独立しています。そのため、MySQLサーバーが稼働していないので、ローカルソケットへの接続が失敗します。
おわりに
以下の記事を参考に、IPアドレスを取得してアクセスすることで解決していたのですが、途中からIPアドレスを指定しても、MySQLに接続することができなくなりました。
そこで、docker psでコンテナが同時に立ち上がっていることに気づき、docker-compose run コマンドの挙動について、理解することで根本的に解決することができました。
参考