Проблемът е свързан с точката на произход. Ако осъществите достъп до localhost от вътрешността на Docker контейнер, localhost сочи към самия докер, а не към хост сървъра, и следователно повикването не достига до хоста или другите докери.
Ако всичките ви докери са на една и съща хост машина, най-лесният начин да ги накарате да говорят помежду си чрез localhost е да споделяте мрежа между контейнерите при изпълнение. Първо стартирайте бекенда нормално, след това стартирайте другите контейнери с --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
Сега всички портове, изложени и картографирани от който и да е от контейнерите, споделящи мрежата, трябва да бъдат достъпни под localhost от всеки от докерите.
- За достъп до контейнера на приложението за услуги отвсякъде използвайте machine:8080.
- За достъп до него локално от хост сървъра използвайте localhost:8080.
- За вътрешен достъп от сервизното приложение използвайте locahost:8080.
- За достъп до сервизното приложение от клиентското приложение използвайте localhost:8080
Клиентското приложение ще бъде изложено само през порт 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.