2016-10-05 6 views
0

Я хочу изолировать свою новую инфраструктуру проекта, используя контейнеры Docker, и я новичок в Docker. У меня проблема. Прежде всего, я покажу пример моей конфигурации, а затем я рассмотрю проблему.Как я могу подключиться к nginx vhost в контейнере Docker из связанного контейнера php Docker?

Конфигурация Пример

nginx: 
     restart: always 
     image: nginx:latest 
     expose: 
      - 80 
     ports: 
      - 8181:80 
#   - 80:80 
     volumes: 
      - ../.:/code 
      - ./docker/nginx/hosts:/etc/nginx/conf.d/ 
      - ./docker/nginx/nginx.conf:/etc/nginx/nginx.conf 
     links: 
      - php 
php: 
     restart: always 
     build: docker/php5.6-fpm 
    # image: php:5.6-fpm 
    # ports: 
    #  - 9000:9000 
     volumes: 
      - ../.:/code 
     links: 
       - redis_loc 
       - postgres_loc 
       - memcached_loc 
       - rabbitmq_loc 

Это пример. Я опустил данные для *_loc. Итак, у меня есть два локальных домена для разработки, например site1.loc и site2.loc. Я использую архитектуру микросервиса, а site2.loc - это микросервис для site1.loc.

У меня есть общий php-контейнер для всего кода микросервисов и У меня есть общий контейнер nginx для всех микросервисов, которые настроены с конфигурационными файлами *.loc.conf. Nginx слушает 80 порт внутри сети Docker. Этот хост доступен через порт 8181 на главной машине. На локальной (основной) машине у меня есть фронт nginx с теми же конфигурациями *.loc, которые настроены как прокси-серверы для 8181 аналоги. Также у меня есть в моих записях /etc/hosts

127.0.0.1 site1.loc 
127.0.0.1 site2.loc 

Таким образом, я могу открыть в браузере как местных сайтов и работать с ними отдельно.

Проблема

Проблема заключается в том, что site2.loc микро-сервис, поэтому он должен быть доступен из site1.loc PHP кода. И теперь, когда я пытаюсь отправить запрос на site2.loc из site1.loc PHP кода я получаю сообщение об ошибке:

'stream_socket_client(): unable to connect to site2.loc:80 (php_network_getaddresses: getaddrinfo failed: Name or service not known)' 

Php не может найти путь к site2.loc.

Я попытался создать функцию докер-компоновщика extra_hosts на контейнерах nginx и php, но это мне не помогло.

#  extra_hosts: 
#   - "site1.loc:nginx" 
#   - "site2.loc:nginx" 

Я попытался настроить пользовательскую сеть, но потом понял, что это неверный путь.

Также я пробовал jwilder/nginx-proxy, но это делает vhosts доступными только для локальной машины, а не внутри php-контейнера.

Я четко понимаю, что источником проблемы является то, что среда внутри php-контейнера ничего не знает о узле site2.loc. И я предполагаю, что мне нужно какое-то отображение хостов или настроить dns.

Но я не знаю, как реализовать такую ​​конфигурацию и не могу найти какой-либо пример (вчера я пробовал через пол дня).

Как я могу сделать site2.loc доступным для site1.loc php code?

UPD

Я просто понял, что мне нужно использовать консул.Есть ли другие пути без Консула?

UPD

помогли способ указания хозяев со ссылкой на 172.17.0.1 в extra_hosts. Подскажите, как лучше выбрать метод для Productions - extra_hosts, dns, Consul? Учитывая, что у меня на сервере несколько проектов рядом, в контейнерах или без.

ответ

1

Вам нужен внешний доступ к вашему микросервису site2.loc? Если вы не можете разделить site1 и site2 в двух Nginx контейнеров, то вы можете сделать, как это с определенными пользователем сети:

  1. Создание сети под названием «приложение-сеть»
  2. При создании каждой службы подключить их в сеть и дать им псевдоним (--network-alias), допустим, вы положили псевдоним site2 на свой микросервис
  3. В Docker есть внутренний DNS-сервер, который будет разрешать имена доменов для контейнера. Поэтому, когда вы хотите получить доступ к сайту2 из кода PHP, просто используйте «site2», который будет разрешен в адрес IP, доступный в контейнере PHP (если все они связаны с одной и той же пользовательской сетью)

Просто убедитесь, что PHP-процесс имеет доступ к файлам PHP с тем же путем, что и nginx.

EDIT: В Docker композе я думаю, чистый псевдоним устанавливается автоматически с именем службы
EDIT2: в том, Docker композе является создание сети автоматически https://docs.docker.com/compose/networking/#/networking-in-compose

+0

Главное здесь это - раскол site1 и site2 в два контейнера nginx. Я хотя об этом решении уже, но я хочу получить доступ к site2.loc с помощью виртуального хоста (по ссылке, например http: //site2.loc), а не по имени docker dns для службы. –

+0

PHP: ... ссылки: - Nginx: site1.loc - Nginx: site2.loc Это должно сделать это путем создания двух псевдонимов для Nginx контейнера и Nginx будет перенаправлять на правый виртуальный хост –

+0

обычно конфигурации когда nginx связывает php в этом направлении, а не наоборот. и невозможно связать назад от php до nginx одновременно. это хорошо известная проблема в докере с двунаправленной связью. и это не может быть разрешено без дополнительного контейнера dns или без использования мягкого обслуживания, например Consul. или, пожалуйста, покажите рабочий пример конфигурации docker-compose, если я не понял вас правильно. –

 Смежные вопросы

  • Нет связанных вопросов^_^