IT技術のパンくず

未来の自分のためにパンくずを残しておくためのブログ

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内の通信の設定とで不整合があるため接続ができなかった。

参考URL

Connect to mysql in a docker container from the host

MySQL クライアントからサーバーへの接続

「UNIX ドメインソケット」と「ソケット」について比較する