開発者向け

コンテナからMacのlocalhostに接続できない

コンテナにはそれぞれ独自のネットワークスタックがあります。コンテナ内のlocalhostはMacではなく、コンテナ自身を指します。

対象:現在のmacOSバージョンのDocker DesktopとOrbStack。確認日:2026年10月29日

症状

  • コンテナ内のアプリがlocalhost:5432などのポートで「connection refused」になる。
  • 同じURLが、MacのSafariやターミナルでは使える。
  • Mac上のモデルサーバやAPIに、開発用コンテナから接続できない。

考えられる原因

  • localhostがコンテナを指している。コンテナは自身のネットワークスタック内でサービスを探しますが、そこでは何も待ち受けていません。
  • ホストのアドレスが変わる。Dockerのドキュメントによると、ホストのIPアドレスは変わります。代わりに、ホストを指す特別な名前が用意されています。
  • Mac上のファイアウォール。macOSのファイアウォールや他のファイアウォールアプリが、サービスへの受信接続をブロックすることがあります。

確認方法

  1. Mac上でサービスが動いていることを確認します。8000は使っているポートに置き換えてください。

    curl http://localhost:8000
  2. Macのサービスがどのアドレスで待ち受けているかを確認します。

    lsof -nP -iTCP:8000 -sTCP:LISTEN

    出力 *:8000はすべてのアドレス、127.0.0.1:8000はループバックアドレスのみを意味します。

  3. イメージにwgetが含まれていれば、コンテナ内からホスト名をテストします。

    docker exec my-container wget -qO- http://host.docker.internal:8000

解決方法

  1. コンテナ内では、localhostの代わりにhost.docker.internalを使います。Docker DesktopとOrbStackはどちらもこの名前に対応しています。

  2. アプリの設定で、環境変数などにこのアドレスを指定します。

    docker run -e API_URL=http://host.docker.internal:8000 my-image
  3. OrbStackでは、代わりにホストネットワークを使うこともできます。その場合、コンテナ内のlocalhostでMacのサービスに接続できます。

    docker run --net host my-image
  4. それでも接続できない場合は、macOSのファイアウォール設定を確認してください。macOSのファイアウォールが受信接続をブロックするを参照してください。

Kilobatを使う場合

  1. Kilobatのチェックはコンテナ内ではなく、Mac上で実行されます。--context containerを付けると、コンテナ内で実行するコマンドが表示されます。

    kilobat why http://localhost:8000 --context container
  2. ホストされたサービスからMacを呼び出す場合は--context providerを使います。すると、localhostはプライベートなのでそのサービスからは届かない、とKilobatが伝えます。

    kilobat why http://localhost:8000 --context provider

よくある質問

host.docker.internalはLinuxでも使えますか?

このページはMacを対象としています。Docker Desktop for MacとOrbStackでは、この名前はホストに解決されます。

コンテナからは接続できないのに、Safariからは接続できるのはなぜですか?

SafariはMac上で動くので、localhostはMacを指します。コンテナには独自のlocalhostがあります。

出典

出典は2026年10月29日に確認しました。manページはmacOSに付属のものです。「ターミナル」でman <name>を実行すると開けます。