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
все мои контейнеры работают
но когда node.app1.com --> он говорит неизвестный носитель .
поэтому, чтобы проверить, придет ли запрос на прокси, я попытался позвонить http://localhost из браузера и он говорит 503
Я также проверил с nginx.config в боковом контейнере по
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)