Problem dotyczy miejsca pochodzenia. Jeśli uzyskujesz dostęp do hosta lokalnego z wnętrza kontenera Docker, host lokalny wskazuje sam docker, a nie serwer hosta, a zatem wywołanie nie dociera do hosta ani innych doków.
Jeśli wszystkie programy dokowane znajdują się na tym samym komputerze hosta, najłatwiejszym sposobem, aby komunikowały się ze sobą za pośrednictwem hosta lokalnego, jest współdzielenie sieci między kontenerami podczas uruchamiania. Najpierw uruchom backend normalnie, a następnie uruchom pozostałe kontenery za pomocą --net przełącznik:
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
Teraz wszystkie porty odsłonięte i zmapowane przez dowolny kontener współużytkujący sieć powinny być dostępne z poziomu hosta lokalnego z dowolnego okna dokującego.
- Aby uzyskać dostęp do kontenera aplikacji usługi z dowolnego miejsca, użyj maszyny:8080.
- Aby uzyskać do niego dostęp lokalnie z serwera hosta, użyj localhost:8080.
- Aby uzyskać do niego dostęp wewnętrznie z aplikacji usługi, użyj locahost:8080.
- Aby uzyskać dostęp do aplikacji usługi z aplikacji klienta, użyj localhost:8080
Aplikacja kliencka zostanie udostępniona światu przez port 3000 tylko wtedy, gdy zostanie ona również ujawniona w oknie dokowanym zawierającym kontener. Odsłonięty port nie powinien być taki sam, ponieważ to myli sieć:
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
Teraz możesz uzyskać dostęp do aplikacji klienckiej z zewnątrz za pomocą maszyny:3001.