Mysql(Docker Container)← localhost のアクセス時にエラー
はじめに
公式のMysql Imageを使用したContainerをポートフォワードして
ホスト上からMysqlにアクセスしようとしたところ以下のエラーが出た。
$ mysql -u root -p Enter password: ERROR 2002 (HY000): Can't connect to local MySQL server through socket '/tmp/mysql.sock' (2)
状況
- Container内からMysqlへのアクセスはできる
- 3306:3306(host port : container port)でポートフォワード後
ホストから接続しようとすると上記エラーがでる - ホスト上ではMysqlサーバーを起動していない
対応
ホスト上からMysqlアクセス時にオプション( --protocol tcp )を付与して実行する。
$ mysql -u root -p --protocol tcp
それかホスト指定のオプションを付与して実行する。
$ mysql -u root -p -h 127.0.0.1
原因
ホスト指定のオプション( -h )を指定しない場合
Mysqlサーバーとの接続に使用するプロトコルはUNIXドメインソケットを使う。
UNIXドメインソケットの詳細については省くが(別記事で書くかも)
単一ホスト内の通信において使用するプロトコルのよう。
通信にはホスト内のファイルシステムを使用しており
今回の場合はエラー文中にあった /tmp/mysql.sock を
使用してMysqlクライアントとMysqlサーバー間で通信しようとしていた。
そのため、ポートフォワードでの擬似的な単一ホスト内の通信という実態と
/tmp/mysql.sock内の通信の設定とで不整合があるため接続ができなかった。