comment atteindre un autre conteneur à partir d’un nginx dockerisé

J’ai nginx dans un conteneur Docker et une webapp nodejs dans un autre conteneur Docker. Le serveur nodejs est accessible depuis le serveur hôte sur le port 8080.

Le conteneur docker nginx écoute le port 80 (fera le certificate plus tard, cette base doit d’abord fonctionner).

Et maintenant, je veux qu’un sous-domaine soit transféré vers cette application 8080 nodejs. disons app1.example.com

De l’extérieur, je peux accéder à l’application par le serveur ip (ou nom d’hôte) et le port 8080, mais pas sur app1.example.com. Et cela fonctionne sur app1.example.com:8080 (j’ai ouvert le port 8080 sur le serveur hôte).

Je reçois un message nginx de mauvaise passerelle à l’approche de app1.example.com Donc, j’entre dans le premier conteneur nginx, mais comment revenir au serveur hôte pour le transmettre au port 8080 du serveur hôte (et non au port) 8080 du conteneur nginx). recherche de la syntaxe EXPOSE inverse.

Le principal problème est, bien sûr, si j’utilise le port ip 127.0.0.1:8080, il essaiera le conteneur nginx …. Alors, comment laisser le conteneur nginx revenir à l’hôte 127.0.0.1:8080?

J’ai essayé 0.0.0.0 et défini un stream en amont, je faisais beaucoup de recherches sur google, et j’ai essayé beaucoup de configurations … mais je n’ai pas encore trouvé de solution.

Modifier Juste découvert, cette commande de docker pourrait aider:

sudo docker network inspect bridge 

Cela montre l’adresse IP utilisée dans les cotainers (dans mon cas 172.17..0.2), mais je ne suis pas sûr que cette adresse rest la même chaque fois que le docker redémarrera … (par exemple, redémarrage du serveur)

Modifier la réponse alcaline suivante que j’ai maintenant (mais ne fonctionne toujours pas):

mon fichier docker-compose.yml:

 version: "2" services: nginx: container_name: nginx image: nginx_img build: ../docker-nginx-1/ ports: - "80:80" networks: - backbone nodejs: container_name: nodejs image: merites/docker-simple-node-server build: ../docker-simple-node-server/ networks: - backbone expose: - 8080 networks: backbone: driver: bridge 

et mon nginx (ignoré l’inclusion dans le dossier conf.d pour plus de simplicité):

worker_processes 1;

événements {worker_connections 1024; }

 http { sendfile on; upstream upsrv { server nodejs:8080; } server { listen 80; server_name app1.example.com; location / { proxy_pass http://upsrv; } } } 

modifier 31-08-2016

ce problème serait le problème, le nom n’est pas backbone, mais appelé après que le dossier a démarré le srevice à partir de:

 sudo docker network ls 

les sorties:

 NETWORK ID NAME DRIVER SCOPE 1167c2b0ec31 bridge bridge local d06ffaf26fe2 dockerservices1_backbone bridge local 5e4ec13d790a host host local 7d1f8c32f259 none null local 

modifier 01-09-2016

Cela peut être dû à la façon dont mon conteneur nginx docker est configuré?

c’est le fichier docker que j’ai utilisé:

 ############################################################ # Dockerfile to build Nginx Installed Containers # Based on Ubuntu ############################################################ # Set the base image to Ubuntu FROM ubuntu # File Author / Maintainer MAINTAINER Maintaner Name # Install Nginx # Add application repository URL to the default sources # RUN echo "deb http://archive.ubuntu.com/ubuntu/ raring main universe" >> /etc/apt/sources.list # Update the repository RUN apt-get update # Install necessary tools RUN apt-get install -y nano wget dialog net-tools # Download and Install Nginx RUN apt-get install -y nginx # Remove the default Nginx configuration file RUN rm -v /etc/nginx/nginx.conf # Copy a configuration file from the current directory ADD nginx.conf /etc/nginx/ # Append "daemon off;" to the beginning of the configuration RUN echo "daemon off;" >> /etc/nginx/nginx.conf # Expose ports EXPOSE 80 # Set the default command to execute # when creating a new container CMD service nginx start 

Ma solution finale 1 sept. 2016

J’ai utilisé ce fichier de composition maintenant:

 version: "2" services: nginx: image: nginx container_name: nginx volumes: - ./nginx-configs:/etc/nginx/conf.d ports: - "80:80" networks: - backbone nodejs: container_name: nodejs image: merites/docker-simple-node-server build: ../docker-simple-node-server/ networks: - backbone expose: - 8080 networks: backbone: driver: bridge 

Dans le dossier du projet, à partir duquel vous exécutez docker-compose up -d, j’ai ajouté un dossier nommé nginx-configs. Ce dossier «écrasera» tous les fichiers du conteneur nginx nommé /etc/nginx/conf.d

J’ai donc copié le fichier default.cfg du conteneur nginx avant d’append ce assembly de volume. en utilisant la commande:

docker exec -t -i nom_conteneur / bin / bash

et que le chat /etc/nginx/conf.d/default.conf

et ajouté le même fichier default.conf dans le dossier du projet avec nginx configs.

Outre le défaut, j’ai ajouté app1.conf avec ce contenu:

 upstream upsrv1 { server nodejs:8080; } server { listen 80; server_name app1.example.com; location / { proxy_pass http://upsrv1; } } 

De cette façon, je peux facilement append une deuxième application … troisième et ainsi de suite.

Donc les bases fonctionnent maintenant …

Voici une pratique exemplaire. N’exposez que le port 80 à l’extérieur de l’hôte. L’application nodejs peut être sur un réseau privé uniquement accessible via nginx.

 version: "2" services: nginx: ... ports: - "80:80" networks: - backbone nodejs: ... networks: - backbone expose: - 8080 networks: backbone: driver: bridge 

Dans votre fichier nginx.conf, les serveurs en amont peuvent être répertoriés en tant que nodejs:8080 . Le démon docker le résoudra en une adresse IP interne correcte.