Docker Desktop for Macのコンテナからローカル環境に接続する方法

インフラ

Docker環境上のアプリケーションが指すlocalhostはローカル環境ではなくコンテナ自身を指しています。
今回はコンテナからローカル環境に接続する方法について紹介します。

なお、Docker Desktop for Macを利用している前提とします。検証環境のバージョンはDocker Desktop for Mac 4.2.0です。

Docker Desktop for Macでローカル環境を参照する方法

host.docker.internalのホスト名を利用することでコンテナからローカル環境に接続できます。

過去にはdocker.for.mac.localhostdocker.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)やってます。フォローしてもらえるとうれしいです!

参考資料