Closed5

Linux で host.docker.internal が繋がらないのは接続先が Docker のイーサネットブリッジを Listen していないからかもしれない

ピン留めされたアイテム
HosokowaRHosokowaR

結論

タイトル通りですが…
host.docker.internalが繋がらない理由は、自分の場合は接続先が Docker のイーサネットブリッジを Listen していないからからでした。

自分の場合は接続先が Vite で立てたフロントエンドのサーバだったのですが、そのサーバは localhost にしか公開されていませんでした。

--host オプションをつけて実行すると、 Docker のイーサネットブリッジを Listen するようになり、無事 Docker コンテナ内部から host.docker.internal でそのフロントエンドサーバを参照することができました。

--host オプションをつけると、いわゆる port: '0.0.0.0' のような振る舞いをします。他のサーバアプリケーションでも同様の仕組みがあるはずです。

※他の原因も考えられるので解決しない場合は「試したこと」を見てみてください。
※Docker Desktop for XXX を使用している人はこのようなことをしなくてもつながるはずです。

HosokowaRHosokowaR

Linux の Docker で host.docker.internal を使用しても、ホストマシンで立てたサーバに繋がらなくて困った & 解決できたのでメモします。検索してもこの事例は見つけられなかったので、誰かのためになればと思い書き残しています。

※自分は Linux やネットワークの知識がまだ不足しているので、書かれている内容は鵜呑みにせず、あくまで「そういう事例があったんだな」ぐらいで読んでもらえると幸いです。

HosokowaRHosokowaR

環境など

$ lsb_release -a
LSB Version:    core-11.1.0ubuntu4-noarch:security-11.1.0ubuntu4-noarch
Distributor ID: Ubuntu
Description:    Ubuntu 22.04.2 LTS
Release:        22.04
Codename:       jammy

$ docker -v
Docker version 20.10.24, build 297e128  # 後述するがここが大事
HosokowaRHosokowaR

やりたかったこと

簡潔に

Docker Compose で立てたサーバから、ホストマシンの localhost で立てたサーバにアクセスしたかったです。

詳細

WEB アプリケーションを開発していました。サーバサイドは Docker Compose で簡単に立てれるようになっており、その Docker Compose で管理しているコンテナの中には Proxy 用の Nginx コンテナがありました。その Proxy 用のコンテナから、ホストマシンの localhost に立てたフロントエンドのサーバにアクセスしたかったのです。

※この構成はすでにあったもので、この構成の是非についてはここで議論しません。

HosokowaRHosokowaR

試したこと

そもそも host.docker.internal がよくわからない方はこちらが参考になります。

https://docs.docker.com/desktop/networking/#use-cases-and-workarounds-for-all-platforms

https://medium.com/@TimvanBaarsen/how-to-connect-to-the-docker-host-from-inside-a-docker-container-112b4c71bc66

上記を読んだ上で以下を試したのですが繋がらりませんでした。

Docker Desktop for Linux を使用する

開発サーバなので GUI がなく、そもそも使えなかった(当然)

Docker が 20.10 以上であることを確認する

Linux の Docker で host.docker.internalが使えるのは 20.10 からでした

$ docker -v
Docker version 20.10.24, build 297e128

ちなみに docker compose ではなく docker-compose を使用している場合は後述する解決法とは異なるかもなので注意です。

compose.yml で以下のオプションを付与する

extra_hosts:
   - "host.docker.internal:host-gateway"

NPM の live-server にコンテナ内部からアクセスできることを確認する

→ アクセスできた!

なぜかホストマシンに立てたフロントエンドのサーバは繋がらない…
→ そこでこのスクラップの「結論」に至ります

このスクラップは1ヶ月前にクローズされました