nginx-прокси для нескольких узлов App docker

Я пытаюсь nginx обратный прокси-сервер несколько контейнеров .

у меня есть 2 контейнера, которые имеют узел добавить один слушать на 8085 и другой на 8086 я хочу, чтобы они получили доступ к

node.app1.com

node.app2.com

поэтому я использовал jwilder / nginx-proxy:последний, который будет сидеть в источнике обоих этих контейнеров и будет действовать как прокси-сервер revers . вот мое сочинение.в формате YML файл.


докер-сочинять.в формате YML

version: "3"
services:
  node-proxy:
    build:  ./node-proxy
    container_name : node-proxy
    restart : always
    volumes:  
        -  /var/run/docker.sock:/tmp/docker.sock:ro
    ports:
      - 80:80
      - 443:443
  node-app1:
    build:  ./app1
    container_name : node-app1
    restart: always
    environment:
      VIRTUAL_HOST: node.app1.com
    depends_on:
      - node-proxy
  node-app2:
    build:  ./app2
    container_name : node-app2
    restart: always
    environment:
      VIRTUAL_HOST: node.app2.com
    depends_on:
      - node-proxy

./ node-proxy/Dockerfile

FROM jwilder/nginx-proxy:latest

./приложения app1/приложения app1.js

var http = require("http");

http.createServer(function (request, response) {

   response.writeHead(200, {'Content-Type': 'text/plain'});
   response.end('Hello World 1n');
}).listen(8085);

./приложения app1/файла Docker

FROM node:6.11
WORKDIR /app2
COPY app1.js .
CMD node app1.js
Expose 8085

./приложении app2/приложении app2.js

var http = require("http");

http.createServer(function (request, response) {

   response.writeHead(200, {'Content-Type': 'text/plain'});
   response.end('Hello World 2n');
}).listen(8086);

./ app2 / Dockerfile

FROM node:6.11
WORKDIR /app2
COPY app2.js .
CMD node app2.js
Expose 8086

поэтому, когда я делаю

docker-compose up 

все мои контейнеры работают

enter image description here

но когда node.app1.com --> он говорит неизвестный носитель .

поэтому, чтобы проверить, придет ли запрос на прокси, я попытался позвонить http://localhost из браузера и он говорит 503

enter image description here

Я также проверил с nginx.config в боковом контейнере по

enter image description here

docker exec - it node-proxy_id bash

cat/etc/nginx / conf.d/

и его там, но я думаю, когда я делаю node.app1.com запрос не приходит к прокси . я не получаю, где я пропустил , может кто-нибудь помочь мне с этим .

Спасибо за ваше время

2 ответов


при установке links или depends_on для других служб docker-compose настроит имя хоста других служб в качестве container_name в той же сети docker по умолчанию.

в вашем случае, я бы предложил добавить links как @Mathias ответить.

version: "3"
services:
  node-app1:
    build:  ./app1
    container_name : node-app1
    restart: always
    expose:
      - "8085"
    environment:
      VIRTUAL_HOST: node.app1.com
  node-app2:
    build:  ./app2
    container_name : node-app2
    restart: always
    expose:
      - "8086"
    environment:
      VIRTUAL_HOST: node.app2.com
  node-proxy:
    build:  ./node-proxy
    container_name : node-proxy
    restart : always
    links:
        - node-app1
        - node-app2
    volumes:
        -  /var/run/docker.sock:/tmp/docker.sock:ro
    ports:
        - 80:80
        - 443:443

обновление:

я заметил, что конфигурация Nginx имеет upstream директива для хранения нескольких имен хостов. Вы должны быть в состоянии свернуть node-app1 as:

$ curl -H 'Host: node.app1.com' localhost
Hello World 1

вы можете также измените последнюю строку в своем node-proxy контейнер:

172.20.0.4 [docker-network-alias] node.app1.com node.app2.com

затем вы должны быть в состоянии посетить http://node.app1.com непосредственно внутри node-proxy контейнер.

вот учебник для настройка виртуальных хостов nginx на ubuntu 16 04

Комментарий I:

в моем понимании,nginx-proxy имеет тенденцию к прокси-запросу на серверную службу, которая не должна регистрировать имя хоста в . Так мы увольняем запрос с Host заголовок, который является виртуальным именем хоста в Nginx upstream блок.

на nginx-proxy сделали эту часть для вас, когда вы создаете переменную среды VIRTUAL_HOST в каждой настройке контейнера приложения. Но это не означает, что мы можем непосредственно посетить node.app1.com в нашем браузере и ожидать, что запрос будет передан и ответ node-app1 контейнер.

назад к части переадресации запроса, Запрос приходит к localhost в порту 80/443, который прослушивается с помощью nginx. Nginx затем проверьте Host заголовок, чтобы перейти в определенное место. Вот почему вы не можете непосредственно посетить http://node.app1.com в вашем браузере, потому что это имя хоста никогда не будет действительно зарегистрировано в etc/hosts, поэтому он никогда не будет решаться каким-либо сервером, приложением или нашим nginx-proxy.

если мы хотим посетить thay hostname браузером, дополнительная настройка для это.

на nginx-proxy проект предоставляет некоторые настройки шаблона, поэтому вы возможно, удастся получить IP-адрес контейнеров приложений и его VIRTUAL_HOST среда, затем добавьте его в . Но таким образом это будет непосредственно посещение сервера приложений узла вместо прокси-сервера из nginx-proxy.

без проблем с уровнем производства я бы предложил добавить Домены приложений в etc/hosts файл в последней строке, которая устанавливается nginx-proxy, тогда он должен работать так, как вы ожидали. В противном случае работа для динамической привязки имени хоста из nginx-proxy шаблоны необходимо.


посмотрите на порты вашего приложения / Dockerfile:

./приложения app1/приложения app1.js

}).слушать(8085);

и

./приложения app1/файла Docker

подвергнуть 8086

они missmatching.


мне не хватает, что jwilder/nginx-proxy отражает docker для поиска контейнеров, которые должны быть проксированы.

Оригинал сообщение:

Я думаю, что ваша проблема в том, что обратный контейнер прокси не может достичь каждого приложения. Для этого удалите depends_on из node-app1 и node-app2 и добавьте в node-proxy:

links:
 - node-app1
 - node-app2 

обратный прокси-сервер требует не только приложения, а не наоборот. Также используйте links вместо depends_on.

С docs:

depends_on

выразить зависимость между услуги, которые имеют два эффекта:

  • docker-compose up запустит службы в порядке зависимости. В следующем примере db и redis будут запущены до web.

  • docker-compose up SERVICE будет автоматически включать зависимости службы. В следующем примере docker-compose up web будет также создайте и запустите db и redis.

ссылки

контейнеры для связанной службы будут доступны с именем хоста, идентичным псевдониму, или с именем службы, если псевдоним не указан.

ссылки также выражают зависимость между службами так же, как depends_on, поэтому они определяют порядок запуска службы.


Я также не уверен, как вы получаете IP-адреса этих контейнеров в конфигурации прокси-сервера. Вы можете использовать (как написано в документации) псевдоним или имя службы вместо. (в вашем случае node-app1 и node-app2)