MySQL、localhostだとポート指定オプション効かないってマジですか。。

検証用のMySQLデータベースをせっかくなのでDockerコンテナで作ったら、接続できないという事態。

docker run -d -p 13306:3306 --name mysql-for-local mysql-for-local

こんな感じでコンテナを起動して

mysql -u root -D my_db -h localhost -P 13306 -A

こんな感じで接続しようとしても繋がらない。。 正確にはローカルのMySQLに繋がってしまう。

docker exec -ti mysql-for-local /bin/bash

して、コンテナ内部でmysqlに接続するとちゃんと繋がる。

もしかして、-Pオプションが効いてない?と思ってぐぐってみたら、まさかそのとおりでした。。

MySQL :: MySQL 5.6 リファレンスマニュアル :: 4.2.2 MySQL サーバーへの接続

Unix では、MySQL プログラムはホスト名 localhost を、ほかのネットワークベースのプログラムと比較して想定されるのとはおそらく異なる、特別な方法で扱います。localhost への接続で、MySQL プログラムは Unix ソケットファイルを使用してローカルサーバーに接続しようとします。これは、ポート番号を指定するために --port または -P オプションが与えられた場合にも生じます。クライアントがローカルサーバーに TCP/IP 接続を行うことを保証するには、--host または -h を使用して、ホスト名の値 127.0.0.1、またはローカルサーバーの IP アドレスまたは名前を指定します。--protocol=TCP オプションを使用して、localhost に対しても、接続プロトコルを明示的に指定することもできます。

localhostをIP指定することで無事解決できました。

mysql -u root -D my_db -h 127.0.0.1 -P 13306 -A

ちなみに、後で知ったのですがMySQLではFAQらしいです。

参考