Я хочу изолировать свою новую инфраструктуру проекта, используя контейнеры 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? Учитывая, что у меня на сервере несколько проектов рядом, в контейнерах или без.
Главное здесь это - раскол site1 и site2 в два контейнера nginx. Я хотя об этом решении уже, но я хочу получить доступ к site2.loc с помощью виртуального хоста (по ссылке, например http: //site2.loc), а не по имени docker dns для службы. –
PHP: ... ссылки: - Nginx: site1.loc - Nginx: site2.loc Это должно сделать это путем создания двух псевдонимов для Nginx контейнера и Nginx будет перенаправлять на правый виртуальный хост –
обычно конфигурации когда nginx связывает php в этом направлении, а не наоборот. и невозможно связать назад от php до nginx одновременно. это хорошо известная проблема в докере с двунаправленной связью. и это не может быть разрешено без дополнительного контейнера dns или без использования мягкого обслуживания, например Consul. или, пожалуйста, покажите рабочий пример конфигурации docker-compose, если я не понял вас правильно. –