Docker環境上のアプリケーションが指すlocalhost
はローカル環境ではなくコンテナ自身を指しています。
今回はコンテナからローカル環境に接続する方法について紹介します。
なお、Docker Desktop for Macを利用している前提とします。検証環境のバージョンはDocker Desktop for Mac 4.2.0です。
Docker Desktop for Macでローカル環境を参照する方法
host.docker.internal
のホスト名を利用することでコンテナからローカル環境に接続できます。
過去にはdocker.for.mac.localhost
やdocker.for.mac.host.internal
で接続できていましたが、Docker Desktop 4.3.0でそれらのホスト名は非推奨および削除予定とされています。1
動作確認
コンテナからdig
を実行した結果は以下の通りです。
### コンテナ上のlocalhostはコンテナ自身のIP(127.0.0.1)を指す
$ docker-compose exec app dig localhost +short
# +short: IPアドレスのみ表示
127.0.0.1
### コンテナからローカル環境のIPを参照する方法
$ docker-compose exec app dig host.docker.internal +short
192.168.65.2
たとえば、ローカル環境の4000番ポートで起動しているJSON Serverのエンドポイント/todos/1
をコンテナから参照する方法は以下の通りです。
### host.docker.internalを利用した場合
$ docker-compose exec app curl http://host.docker.internal:4000/todos/1
{
"id": 1,
"content": "go somewhere",
"completed": true
}
### IPアドレスを直接指定した場合
$ docker-compose exec app curl http://192.168.65.2:4000/todos/1
{
"id": 1,
"content": "go somewhere",
"completed": true
}
さいごに
Twitter(@nishina555)やってます。フォローしてもらえるとうれしいです!