Docker Container内部で動作している環境からMac上で動作しているサービスへ接続することが出来ずハマったので、その解決方法をメモしておきます。
よくあるMacからDocker上のサービスへ接続するのとは接続方向が逆になりますのでご注意ください。
背景
VirtualBox上にNAT network interface1つを接続した状態で仮想Ubuntuサーバを立ち上げ、
そこへPostgreSQL(ポート番号:5432)を立ち上げました。
その後、VirtualBoxのPort Forwarding機能でHost:5432 Guest:5432 でForwardする設定をしました。
この状態であれば、MacへPostgreSQLクライアントをインストールして、localhost:5432
へ接続することで仮想マシンで動作しているPostgreSQLへ接続可能です。
ところが、Mac環境をなるべく汚したくない私はpsqlコマンドをローカルにインストールすることを嫌い、PostgreSQLのDockerイメージを使って確認することにしました。
その際に接続できなくてハマりました。
解決方法
docker run -it --rm postgres psql -U root -h host.docker.internal
はい、結論から書くとこれが答えになります。
ポイントは、接続先をlocalhost:5432にするのではなく、host.docker.internal:5432
にすることです。
どうやら、Docker Container上から見てローカル環境(Mac)のIPアドレスは、localhostと指定するのでは接続できず(おそらくDocker Containerそのものを指定してしまう?)、 host.docker.internal
を指定する必要があるようです。
DockerはMac上の1プロセスとして動作するという理解をしているので、psqlコマンドを単体で実行するのと同じようなイメージでlocalhostを指定していたのでハマってしまいました。
参考情報など
公式: https://docs.docker.com/docker-for-mac/networking/#use-cases-and-workarounds
I WANT TO CONNECT FROM A CONTAINER TO A SERVICE ON THE HOST
StackOverFlow: https://stackoverflow.com/questions/24319662/from-inside-of-a-docker-container-how-do-i-connect-to-the-localhost-of-the-mach
Edit: If you are using Docker-for-mac or Docker-for-Windows 18.03+, just connect to your mysql service using the host host.docker.internal.