32 votes

Docker Nginx Proxy : comment acheminer le trafic vers un conteneur différent en utilisant le chemin et non le nom d'hôte

Disons que j'ai maintenant différentes applications fonctionnant sur le même serveur sur différents chemins :

  • 10.200.200.210/ app1
  • 10.200.200.210/ app2
  • 10.200.200.210/ app3

Je veux exécuter chaque application sur un conteneur Docker différent en utilisant nginx comme proxy.

J'ai essayé jwilder/nginx-proxy et fonctionne très bien si j'utilise différents noms de domaine (app1.domain.com, app2.domain.com, etc.), mais je ne peux pas utiliser de domaines, je dois utiliser la même IP.

Je ne peux pas non plus utiliser des ports différents comme :

  • 10.200.200.210:81/ app1
  • 10.200.200.210:82/ app2
  • 10.200.200.210:83/ app3

tout doit fonctionner sur le port 80.

  1. Il existe un moyen de configurer jwilder/nginx-proxy pour faire ça ?
  2. Il y a une autre image Docker comme jwilder/nginx-proxy qui la composent.
  3. ou pouvez-vous me donner des conseils pour construire un conteneur docker nginx par moi-même ?

34voto

Alexander Points 707

Au cas où quelqu'un chercherait encore la réponse. jwilder/nginx-proxy vous permet d'utiliser une configuration personnalisée de Nginx, soit à l'échelle du proxy, soit par VIRTUAL_HOST.

Voici comment vous pouvez le faire avec la configuration de l'emplacement Per-VIRTUAL_HOST.

  1. Dans votre dossier poject, créez un autre dossier - "vhost.d".
  2. Créez le fichier "whoami.local" avec la configuration personnalisée de nginx dans le dossier "vhost.d". Ce fichier doit avoir le même nom que VIRTUAL_HOST !

./vhost.d/whoami.local

location /app1 {
  proxy_pass http://app1:8000;
}

location /app2 {
  proxy_pass http://app2:8000;
}
  1. Créer le fichier docker-compose.yml.

./docker-compose.yml

version: '3'

services:
  nginx-proxy:
    image: jwilder/nginx-proxy
    ports:
    - "8080:80"
    volumes:
    - /var/run/docker.sock:/tmp/docker.sock:ro
    - /path/to/vhost.d:/etc/nginx/vhost.d:ro

  gateway:
    image: jwilder/whoami
    environment:
    - VIRTUAL_HOST=whoami.local

  app1:
    image: jwilder/whoami

  app2:
    image: jwilder/whoami
  1. Exécutez docker-compose up
  2. Vérifier la configuration

Dans bash run :

$ curl -H "Host: whoami.local" localhost:8080
I'm 1ae273bce7a4
$ curl -H "Host: whoami.local" localhost:8080/app1
I'm 52b1a7b1992a
$ curl -H "Host: whoami.local" localhost:8080/app2
I'm 4adbd3f9e7a0
$ docker ps
CONTAINER ID        IMAGE                 COMMAND                  CREATED             STATUS              PORTS                  NAMES
6a659a4d4b0a        jwilder/nginx-proxy   "/app/docker-entrypo…"   54 seconds ago      Up 53 seconds       0.0.0.0:8080->80/tcp   nginxreverseproxy_nginx-proxy_1
4adbd3f9e7a0        jwilder/whoami        "/app/http"              54 seconds ago      Up 53 seconds       8000/tcp               nginxreverseproxy_app2_1
52b1a7b1992a        jwilder/whoami        "/app/http"              54 seconds ago      Up 53 seconds       8000/tcp               nginxreverseproxy_app1_1
1ae273bce7a4        jwilder/whoami        "/app/http"              54 seconds ago      Up 53 seconds       8000/tcp               nginxreverseproxy_gateway_1

Vous pouvez également ajouter le domaine "whoami.local" au fichier /etc/hosts et faire des appels à ce domaine directement.

/etc/hosts

...
127.0.0.1   whoami.local
...

Résultat :

$ curl whoami.local:8080
I'm 52ed6da1e86c
$ curl whoami.local:8080/app1
I'm 4116f51020da
$ curl whoami.local:8080/app2
I'm c4db24012582

7voto

亚里士朱德 Points 119

Il suffit d'utiliser nginx pour créer le conteneur, **n'oubliez pas de définir le réseau "hôte" **qui fera que votre conteneur partagera la même adresse et le même port avec la machine hôte.mount nginx.conf et la table de configuration du proxy, par exemple :

commande docker :

docker run --name http-proxy -v /host/nginx.conf:/etc/nginx/nginx.conf --net host -itd --restart always nginx

nginx.conf :

server {
  listen 80;
  location /app1 {
    proxy_pass YOUR_APP1_URL;
  }
  location /app2 {
    proxy_pass YOUR_APP2_URL;
  }
}

6voto

GuySoft Points 313

Voici une liste complète nginx.conf

Il redirige tout vers Root, et seulement /api dans un autre conteneur.

Source et exemple de conteneur l'utilisant

user  nginx;
worker_processes  1;

error_log  /var/log/nginx/error.log;

events {
    worker_connections  1024;
}

http {
  server {
        listen 80;
        location / {
            proxy_pass http://frontend:3000/;
        }
        location /api {
            proxy_pass http://backend/api;
    }
  }
}

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X