Intereting Posts
Отображение случайного хост-сервера Rancher CLI Android-эмулятор в Docker Использование docker-compose (ранее fig) для привязки изображения cron Повар и докер Не удалось получить доступ к контейнерам-контейнерам, созданным внутри докеров Невозможно увеличить размер контейнера для докеров – Ubuntu 16.04 Клонирование докеров – разрешение отклонено Как использовать Capistrano с Rails и Docker-compose? Установите переменную среды docker-compose, чтобы правильно запустить Jenkins с пользовательской java System.Property выполнить двоичный код на связанном контейнере в докере Как я могу использовать базовое изображение для создания своего собственного без зависимости? Docker Datacenter: Ошибка сертификата x509, подписанная неизвестными полномочиями UCP 2.0.0 и DTR 2.1.0 с внешними сертификатами Докер: Докеры виртуальных хостов apache Горячая загрузка webpack-dev-server не работает с boot2docker Dockerized gitlab использует хост-докер для CI

nginx-proxy для более чем одного приложения для док-станции

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

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

node.app1.com

node.app2.com

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


докер-compose.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 1\n'); }).listen(8085); 

./app1/Dockerfile

 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 2\n'); }).listen(8086); 

./app2/Dockerfile

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

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

 docker-compose up 

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

введите описание изображения здесь

но когда do node.app1.com -> это скажем, неизвестный хост.

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

введите описание изображения здесь

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

введите описание изображения здесь

docker exec -it node-proxy_id bash

cat /etc/nginx/conf.d/

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

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

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

В вашем случае я бы предложил добавить 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 по теме 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 как:

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

Вы также можете изменить последнюю строку в etc/hosts в контейнере 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 имеет тенденцию прокси-запроса к серверной службе, которая не должна регистрировать имя хоста в /etc/hosts . Поэтому мы запускаем запрос с заголовком Host который является виртуальным именем хоста в блоке upstream Nginx.

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 браузером, вам потребуется дополнительная настройка для etc/hosts .

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

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

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

./app1/app1.js

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

а также

./app1/Dockerfile

Expose 8086

они пропускают.


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

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

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

 links: - node-app1 - node-app2 по теме links: - node-app1 - node-app2 

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

Из документов :

зависит от

Экспресс-зависимость между службами, которая имеет два эффекта:

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

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

связи

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

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

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