Dockerで立ち上げたmysqldに接続する

発生した問題

dockerで立ち上げたmysqldにローカルで接続しようとした場合、ローカルだからとホスト名を指定しなかったり、localhostで接続しようとすると例えば下記エラーが発生する。

ERROR 2002 (HY000): Can’t connect to local MySQL server through socket ‘/tmp/mysql.sock’ (2)

解決方法

解決方法は、例えば以下のようにしてlocalhostを利用した接続を行わないようにすること。

mysql --host=127.0.0.1
# /etc/hostsに127.0.0.1を指示するlocalmysqlを追加した上で以下のようにしてもよい
mysql --host=localmysql

原因とか。

mysqlは、localhostを利用した接続に際してはUNIXドメインソケットを利用した通信を試みる。 でも、dockerで起動したデーモンの場合はローカルではあるものの、ファイルシステムが切り分けられているから、UNIXドメインソケットを利用した通信が可能にはなっておらず、接続できない。また、接続先ホスト名を省略した場合にはlocalhostを指定したものと解釈されるので、ホスト名省略した場合も同様の問題が起きる。

他方、接続先がlocalhostではない場合にはmysqlはTCP/IPを利用した通常の通信を試みる。この場合には上記問題は生じず、接続が成功できる。

という仕組み、らしい。

参考