Dockerコンテナからホストで動いているWebAPIにアクセスする

先に結論

以下の設定を利用すればアクセス可能
参考:https://docs.docker.com/docker-for-windows/networking/

host.docker.internal

アクセス例:
http://host.docker.internal:5000/webapi/

事の発端

現在、画像ベースのレコメンドシステムを作成しており、以下のような構成で動いています。

Webアプリ:
 Laravelで作成、Dockerコンテナで動作
リコメンドエンジン:
 Python + Flaskで作成、ホストマシン(Windows上) で動作

この時、Dockerコンテナで動いているLaravelアプリケーションから、ホストマシンで動ているPythonへアクセスする必要が出てきました。

リコメンドエンジンはPython + Flaskで動いており、WebAPIとして動作しています。
Laravelから「 file_get_contents 」関数を利用しホストのWebAPIへアクセス、レスポンスを取得する方法を用いることにしました。

ホストにアクセスする

いろいろ調べたところ、冒頭で紹介した「host.docker.internal」が利用できることが分かりました。
試しにDockerコンテナ内からpingを実行してみると・・・

きちんとpingが通りましたね

プログラム内では、以下のような記述でアクセス可能でした

    public function recommend(RecommendRequest $request)
    {
        $imagefile = $request->file('img');
        $temp_path = $imagefile->store('public/upload');
        $filenameArr = explode('/', $temp_path);

        // 外部APIを呼び出し、リコメンド結果を受け取る         
        $html = file_get_contents('http://host.docker.internal:5000/imgPath/' . $filenameArr[2]);
    }

以上でDockerコンテナからホストへアクセスする方法の紹介は終了です。
Dockerは便利でよく利用はしていますが、まだまだ知らないことばかりです。