You are currently viewing MySQL 127.0.0.1とlocalhostは微妙に違う話

MySQL 127.0.0.1とlocalhostは微妙に違う話

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.1

localhostを利用してしまうと、以下のエラーが発生します

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に接続する場合」の内容のため、別の環境の場合は上記の限りではないのでご注意ください

コメントを残す