Le problème est lié au point d'origine. Si vous accédez à localhost depuis l'intérieur d'un conteneur Docker, le localhost pointe vers le docker lui-même, pas vers le serveur hôte, et par conséquent l'appel n'atteint ni l'hôte ni les autres dockers.
Si tous vos dockers sont sur la même machine hôte, le moyen le plus simple de les faire parler entre eux via localhost est de partager un réseau entre les conteneurs en cours d'exécution. Commencez par exécuter le backend normalement, puis démarrez les autres conteneurs avec le --net commutateur :
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
Désormais, tous les ports exposés et mappés par l'un des conteneurs partageant le réseau doivent être accessibles sous localhost à partir de l'un des dockers.
- Pour accéder au service-app-container où que vous soyez, utilisez machine:8080.
- Pour y accéder localement depuis le serveur hôte, utilisez localhost:8080.
- Pour y accéder en interne à partir de l'application de service, utilisez locahost :8080.
- Pour accéder à l'application de service à partir de l'application cliente, utilisez localhost :8080
L'application cliente ne sera exposée au monde sur le port 3000 que si vous l'exposez également dans le menu fixe contenant le conteneur. Le port exposé ne doit pas être le même car cela confond le réseau :
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
Vous pouvez désormais accéder à l'application cliente de l'extérieur à l'aide de machine :3001.