mysqlにlocalhostで接続する場合、(おそらく)自動的にunix domain socket経由で接続しようとする。
dockerで起動した場合やローカルポートからproxyしてmysqlに接続しているような場合は、unix domain socketのファイルは存在しないため以下のようなエラーが発生してしまう。
$ mysql -h localhost --port 3306 -u root -ppass
Warning: Using a password on the command line interface can be insecure.
ERROR 2002 (HY000): Can't connect to local MySQL server through socket '/var/run/mysqld/mysqld.sock' (2)
解決方法
接続するプロトコルを--protocolで指定できる。socketやtcpの他、pipeやmemoryなどがあるらしい。
$ mysql -h localhost --port 3306 --protocol tcp -u root -ppass
これでdockerを使って即座にDBを用意することができる。
publishするportを変えれば複数のportを使って複数のmysqlインスタンスも起動可能。
$ docker run -d -e MYSQL_ROOT_PASSWORD=pass -p 3306:3306 mysql:5.6
$ mysql -h localhost --port 3306 --protocol tcp -u root -ppass
別の方法
接続先がlocalhostでなければunix domain socket経由で接続しようとしないのでローカルマシンのIPを指定すればもちろん接続できる。
自分のIPアドレスを知るのは結構面倒なことが多いしそもそもpublicにしていないことが多いのでプロトコル指定した方が便利。
$ IPADDR=`ip -f inet -o addr show eth0 |cut -d\ -f 7 | cut -d/ -f 1`
$ mysql -h $IPADDR --port 3306 -u root -ppass