127.0.0.1, localhostはどちらも自分自身に接続するためによく利用される記述です
当然、ローカルで動作しているMySQLに接続する場合、以下のように記述を行うわけですが、「ローカルマシンで動作しているMySQL」「ローカルのDockerコンテナで動いているMySQL」に接続する場合、それぞれ注意が必要です
ローカルマシンのMySQLに接続するなら、127.0.0.1, localhostのどちらでもOK
例えば以下のコマンドでローカルマシンのMySQLに接続できます
mysql -u user -p -h 127.0.0.1 → TCP/IP接続
mysql -u user -p -h localhost → Unixソケット接続Dockerコンテナに接続する場合、127.0.0.1を利用する
ホストOSからDockerコンテナのMySQLに接続する場合、127.0.0.1を利用します
mysql -u user -p -h 127.0.0.1localhostを利用してしまうと、以下のエラーが発生します
ERROR 2002 (HY000): Can't connect to local MySQL server through socket '/tmp/mysql.sock' (2)DockerコンテナのMySQLはホストOSとは別の環境で動作しているため、ホストOS側のUnixソケットからDockerコンテナのMySQLへ接続することはできません
なぜDockerコンテナにはlocalhostで接続できないのか
MySQL接続時にlocalhostを指定すると、MySQLクライアントが「localhost接続ならソケットを利用する」という仕様に基づいて、ソケット接続でMySQLに接続します
参考情報
https://dev.mysql.com/doc/refman/9.7/en/can-not-connect-to-server.html
ただし、Dockerコンテナで動作しているMySQLに接続する場合、TCP/IP接続を行わないとポートフォワードでコンテナのMySQLに接続できないため、DockerコンテナのMySQLに接続する場合は「127.0.0.1」を指定する必要があります
ちなみにprotocolオプションを指定すれば、localhostを指定してもTCP/IP接続となり、Dockerコンテナ内のMySQLに接続できます
mysql -u user -p -h localhost --protocol=TCP以上
ということで、MySQL利用時の127.0.0.1、localhostの小話でした
普段はあまり両者の違いを意識することは少ないですが、MySQLを利用するときは意識する必要がありますね
また今回は「ホストOSからポートフォワードされたDockerコンテナのMySQLに接続する場合」の内容のため、別の環境の場合は上記の限りではないのでご注意ください