Dockerで2つのプロジェクトで参照し合う場合の注意の話

開発環境としてDockerって結構使いますよね。
今回は開発プロジェクトが別の開発プロジェクトにアクセスするときに発生しました不具合とその対応を書いておきたいと思います。
正直、この問題は難しくて一日悩んでいました。
答えはシンプルでしたw

開発環境

はじめに開発環境を書いておきます。

今回はPHPStormを使いまして以下のプロジェクトを作成しています

  • Webページのプロジェクト(port : 8000)
  • Web API開発プロジェクト(port : 8001)

それぞれの動作確認はHTTP Requestとブラウザにて確認していました。

不具合

はじめに開発スケジュールを書き出します

  1. Webページプロジェクトの開発 ( リリースしたWeb APIを利用 )
  2. 今回、Web APIプロジェクトの追加機能を開発
  3. WebページプロジェクトからWeb APIプロジェクトにアクセスして動作確認
  4. << 不具合発生 >>

不具合発生でWebページからアクセスできない;;
となっております
今考えると1で動作確認しているんですよねw

何も考えず設定しますとWebページプロジェクトからWeb APIプロジェクトにアクセスするにはPHPStormでいじっているとおりにlocalhost :8001と指定しますよね。

想定する頭の中を図にするとこんな感じです

でも、これの場合動きません…

ここでのポイントはlocalhostはPHPStormが動作している開発PCのlocalhostではありません。
実際は実行コンテナがlocalhostに当たります。
つまりはこんな感じになります。

Webページプロジェクトからlocalhostを参照すると自分の8001にアクセスします…
つまり何のサービスをしていないポートにアクセスすることになります

問題の解決方法

この問題の解決するにはどうすれば良いでしょうか?
はい、この場合にはシンプルでした開発PCのIPを指定してやれば動作します

これで平和になりました。

Web APIプロジェクトの動作確認後 Webページプロジェクトの参照先を変更したコンフィグはコミットしないように注意が必要ですね

引っかかった問題

ってかPHPで開発していたWebページプロジェクトの時のエラーメッセージに引っかかりました。
エラーメッセージは以下です…

ErrorException: Undefined variable: http_response_header in file .../WebAPIAccessService.php on line 49

エラー発生部分抜粋すると

        $contents = @file_get_contents($url, false, stream_context_create($options));
        Log::debug("APIAccessService@post_request : headers "
            . print_r($http_response_header,true)
            . ' contents ' . "\n"
            . print_r($contents,true));

file_get_contentsなんてレガシーなもの使っていたからあれだし調べるとこんなの出ているし

【PHP8.1】PHP8.1で削除される機能 – Predefined variable $http_response_header –

https://qiita.com/rana_kualu/items/c894b2160d1f8799eed2#predefined-variable-http_response_header

え!?PHP 8.1に移行したばかりなのにこんなトラップが!とか思っていました

そう、公開中のWeb APIにアクセスできていたことを失念していましてw
近々に開発環境をPHP 8.1に切り替えてたことに注意を向けてしましました。
実行環境を確認するとPHP 8.1ではなくPHP 7.4だったので合わせたり…
試行錯誤していましたが、結論 Dockerコンテナのlocalhostでした

file_get_contentsで開いていないポートにアクセスするとhttp_response_headerがnullって…

その辺りは勉強になりましたw

そもそもレガシーなfile_get_contentsなんて使っているからでしょうね
作っていたときに考えなしでどっかからコピペしていたのでしょう
コピペはだめですね…

終いに

今回の問題点はDockerコンテナも独立したサーバっぽいということです。
つまりはlocalhostは開発PCではなく自分のコンテナを指すということです

今後同じミスしないようにメモっておきます