Используя nginx в качестве обратного прокси и балансировщика нагрузки, есть ли способ автоматически обнаруживать новые экземпляры контейнера при использовании docker-compose?

#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.