問題は原点に関連しています。 Dockerコンテナ内からlocalhostにアクセスする場合、localhostはホストサーバーではなくDocker自体を指しているため、呼び出しはホストまたは他のDockerに到達しません。
すべてのDockerが同じホストマシン上にある場合、ローカルホストを介してDockerを相互に通信させる最も簡単な方法は、実行時にコンテナー間でネットワークを共有することです。最初にバックエンドを通常どおり実行し、次に-netを使用して他のコンテナを起動します スイッチ:
docker run [other params] -d -p 8080:8080 --name service-app-container service_app_image
docker run [other params] -p 3000:3000 --net="container:service-app-container" --name client-app-container client_app_image
これで、ネットワークを共有するコンテナのいずれかによって公開およびマッピングされたすべてのポートに、ローカルホストの下で任意のドッカーから到達できるようになります。
- どこからでもservice-app-containerにアクセスするには、machine:8080を使用します。
- ホストサーバーからローカルにアクセスするには、localhost:8080を使用します。
- サービスアプリから内部的にアクセスするには、locahost:8080を使用します。
- クライアントアプリからサービスアプリにアクセスするには、localhost:8080を使用します
クライアントアプリは、コンテナーを含むDockerでも公開する場合にのみ、ポート3000を介して世界に公開されます。公開されたポートは、これがネットワークを混乱させるのと同じであってはなりません:
docker run [other params] -d -p 8080:8080 3001:3000 --name service-app-container service_app_image
docker run [other params] -p 3000:3000 --net="container:service-app-container" client_app_image
これで、machine:3001を使用して外部からクライアントアプリにアクセスできるようになりました。