#docker #nginx #docker-compose #load-balancing #reverse-proxy
#docker #nginx #docker-compose #балансировка нагрузки #обратный прокси
Вопрос:
У меня есть настройка docker-compose, где контейнер nginx используется в качестве обратного прокси и балансировщика нагрузки для остальных контейнеров, составляющих мое приложение.
Я могу запустить приложение с помощью docker-compose up -d
, и все работает отлично. Затем я могу масштабировать один из своих сервисов с помощью docker-compose up -d --scale auth=3
, и все продолжает работать нормально.
Единственная проблема заключается в том, что nginx еще не знает о двух новых экземплярах, поэтому мне нужно вручную перезапустить процесс nginx внутри запущенного контейнера, используя docker exec revproxy nginx -s reload
, «revproxy» — это имя контейнера nginx.
Это прекрасно, я не возражаю против запуска дополнительной команды, когда решу масштабировать один из своих сервисов. Однако реальная проблема заключается в том, что где-то происходит сбой контейнера … nginx должен знать, как только это произойдет, чтобы прекратить отправку трафика на отказавший экземпляр, пока механизм Docker не сможет заменить его исправным.
Учитывая все сказанное, по сути, я хотел бы выполнить то, что они делают в руководстве по быстрому запуску Traefik, за исключением того, что я хотел бы использовать nginx в качестве обратного прокси.
Комментарии:
1. Известно ли вам о модуле nginx ? Я думаю, можно попросить Docker уведомить модуль nginx, чтобы он автоматически перенаправлял к новому контейнеру
Ответ №1:
Хотя я лично думаю, что Traefik в вашем случае значительно сэкономил бы время, есть другой проект, который делает то, что вы хотите, с nginx: jwilder/nginx-proxy.
Он работает путем прослушивания событий docker engine, и когда контейнеры добавляются или удаляются, он обновляет конфигурацию nginx с помощью шаблона.
Вы могли бы либо использовать этот jwilder/nginx-proxy
образ docker в is is, либо вы также можете создать свой собственный вариант, используя проект jwilder / docker-gen, который является частью, создающей файл с учетом шаблона и событий docker engine.
Но опять же, я бы рекомендовал Traefik ; за сэкономленное время и проблемы, а также за все функции, которые с ним поставляются (различные стратегии балансировки нагрузки, проверки работоспособности, автоматические выключатели, автоматическую настройку SSL-сертификата с помощью ACME / Let’s Encrypt, …)
Ответ №2:
Вам просто нужно написать скрипт обнаружения службы, который ищет обновленный список контейнеров каждые X интервалов и соответствующим образом обновляет конфигурацию nginx.