В каком месте рекомендуется размещать nginx: внутри или вне compose?

Как оптимально упаковать несколько проектов на NodeJS в docker-compose: включать ли Nginx в каждый Docker-контейнер или установить его на хост и создать несколько конфигураций для различных проектов (некоторые с несколькими приложениями, некоторые с базой данных, некоторые без)? Интересует опыт практического применения, а не теоретические рекомендации. Спасибо.
  • 23 января 2024 г. 18:00
Ответы на вопрос 2
При развертывании нескольких проектов на Node.js с использованием Docker и docker-compose принято следовать нескольким основным практическим рекомендациям. Выбор между включением Nginx в каждый Docker-контейнер или его размещением на хосте зависит от конкретного сценария и требований к масштабируемости, безопасности и легкости управления. Вот несколько вариантов размещения Nginx:

1. **Отдельный контейнер для Nginx:**
   
   Разместить Nginx внутри своего собственного контейнера и использовать его в качестве обратного прокси для Node.js приложений, которые также находятся в своих собственных контейнерах. Это значит, что в `docker-compose.yml` файле у вас будет отдельный сервис для Nginx и отдельные сервисы для каждого Node.js приложения.

   Преимущества этого подхода:
   - Легкость масштабирования отдельных компонентов системы.
   - Централизованное управление точками входа и SSL-сертификатами.
   - Изоляция конфигурации Nginx от приложений.
   
   Минусы:
   - Необходимость управления дополнительным контейнером.

2. **Nginx на хост-системе:**
   
   Установка Nginx на хостовой машине может быть предпочтительнее, если вам нужен единый точка входа для всех контейнеров и приложений, и вы хотите избежать накладных расходов на запуск дополнительных контейнеров.

   Преимущества этого подхода:
   - Нет накладных расходов на запуск дополнительного контейнера.
   - Упрощение сетевой конфигурации, т.к. нет необходимости взаимодействовать с внутренней сетью Docker.

   Минусы:
   - Не так легко масштабировать и обновлять, как контейнер.

3. **Nginx в каждом Docker-контейнере:**
   
   Включение экземпляра Nginx в каждый Docker-контейнер с приложением на Node.js не является обычной практикой, так как это создает избыточность и усложняет масштабируемость и управление.

   Преимущества этого подхода:
   - Простота в разработке и тестировании, так как весь стек (клиент, сервер, прокси) находится в одном месте.

   Минусы:
   - Повышенное потребление ресурсов из-за нескольких экземпляров Nginx.
   - Усложнение масштабирования и управления.

В целом, в большинстве случаев предпочтительнее первый вариант с отдельным контейнером для Nginx. Это упрощает масштабирование и управление инфраструктурой, а также обеспечивает гибкость при работе с несколькими приложениями, которые могут требовать различных конфигураций Nginx.

Например, ваш `docker-compose.yml` может выглядеть примерно так:

```yaml
version: '3'

services:
  nginx:
    image:
В каждый - не нужно. Сделайте отдельный контейнер с nginx, и пусть остальные ходят наружу через него. Ну или как-то "попроектно" разделите. 

В целом, nginx без высокой нагрузки ресурсов потребляет копейки - на фоне жирной ноды этот оверхед скорее всего будет незаметен.
Похожие вопросы