J’ai 3 pièces distinctes à mon application dockerized:
nodeapp
: node:latest
conteneur docker exécutant une application expressjs qui renvoie un object JSON lorsqu’il est accessible depuis /api
. Ce serveur est également compatible avec ce site . nginxserver
: Un nginx:latest
serveur statique qui héberge simplement un fichier index.html
qui permet à l’utilisateur de cliquer sur un bouton qui rend le XMLHttpRequest vers le serveur de noeud ci-dessus. Le node:latest
a son port exposé à l’hôte via 3000:80
.
Le nginx:latest
a son port exposé à l’hôte via 8080:80
.
De l’ hôte, je peux accéder à la fois à nodeapp et à nginxserver individuellement : je peux faire des requêtes et voir l’object JSON renvoyé par le serveur de noeud en utilisant curl
depuis la ligne de commande et le bouton (index.html) est visible à l’écran localhost:8080
.
Cependant, lorsque j’essaie de cliquer sur le bouton, l’appel à XMLHttpRequest('GET', 'http://nodeapp/api', true)
échoue sans apparemment toucher le serveur nodeapp
(aucun journal n’est présent). Je suppose que c’est parce que l’ hôte ne comprend pas http://nodeapp/api
.
Y a-t-il un moyen de dire à docker que pendant qu’un conteneur est en cours d’exécution pour append son conteneur liant l’alias à mon fichier hosts?
Je ne sais pas si ma question est la solution appropriée à mon problème. Il semble que je reçoive une erreur COR, mais je ne pense pas qu’elle frappe mon serveur. Est-ce que cela concerne l’access à l’application depuis mon ordinateur hôte?
Voici un lien vers un exemple de repo
Edit : J’ai remarqué que lorsque vous utilisez la stack, cliquer sur le bouton envoie une réponse de mon conteneur nginx . Je suis confus quant à pourquoi il achemine via ce serveur que le nodeapp
est dans mon fichier hosts
afin qu’il devrait reconnaître la corrélation là-bas?
Problème :
nodeapp
existe dans le réseau interne, visible uniquement par votre nginxserver
, vous pouvez le vérifier en entrant nginxserver
docker exec -it nginxserver bash # cat /etc/hosts
Plus important encore, la configuration de votre service n’est pas correcte, nginxserver
agira en tant que proxy inverse devant nodeapp
host (client) -> nginxserver -> nodeapp
Solution rapide sale :
Si vous voulez vraiment que votre client ( hôte ) accède à l’application interne nodeapp
, alors vous changez simplement le code ci-dessous
XMLHttpRequest('GET', 'http://nodeapp/api', true)
À
XMLHttpRequest('GET', 'http://localhost:3000/api', true)
Étant donné que dans votre docker-compose.yml
, le port de service nodeapp
80
est exposé dans le réseau domestique au nodeapp
3000
, auquel vous pouvez accéder directement.
Meilleure solution
Vous devez repenser votre stack de services, pour que nginxserver
noeud frontal, consultez un exemple: http://schempy.com/2015/08/25/docker_nginx_nodejs/