Несколько контейнеров docker nginx или один контейнер docker nginx

#docker #nginx #containers

#docker #nginx #контейнеры

Вопрос:

Я ищу наилучшую практику для нескольких контейнеров nginx с поддержкой tld. Пожалуйста, рассмотрите следующий файл docker-compose:

 frontend:
    build:
      context: nginx/
    hostname: frontend-docker
    ports:
      - "32777:80"

backend:
    build:
      context: nginx/
    hostname: backend-docker
    ports:
      - "33777:80"

proxy:
  image: nginx
  hostname: proxy-docker
  links:
    - frontend
    - backend
  ports:
    - "80:80"
  

Описание Как вы видите, я могу получить доступ к интерфейсу и серверной части на localhost: 32777 и localhost: 33777, но когда я добрался до prod, я хочу получить доступ к интерфейсу на site.com и бэкэнд в backend.site.com . В этом случае появляется proxy контейнер, который содержит server_name backend.site.com; и server_name site.com и создает обратный прокси для http://frontend и http://backend

Мой вопрос в том, должен ли я избавиться от прокси-контейнера и поместить server_name часть непосредственно в frontend и backend контейнер и даже создать один контейнер с именем web , который backend and frontend там хранится.

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

Ответ №1:

Адресация frontend и backend контейнеры непосредственно извне, скорее всего, не будут работать, потому что вы не можете привязать порт 80 к хосту более одного раза.

Если frontend и backend являются разными приложениями, вы можете захотеть создавать их образы с разными Dockerfile s.

Пока мы этим занимаемся, вы можете рассмотреть простое решение для балансировки нагрузки, например https://traefik.io / в качестве интерфейса для ваших контейнеров. Но, возможно, это излишне для вашего текущего варианта использования, и вы хотите придерживаться приведенной выше конфигурации.

Комментарии:

1. да, я не могу связать два на порту 80, но я могу объединить их все в один контейнер. У них есть изображения, разные базы данных — это упрощенная конфигурация только для доступа к ним за пределами мира. Должен ли я объединяться в один nginx или в 3. Каковы потери производительности?

2. Как правило, чем больше вы запускаете (обрабатываете), тем больше ресурсов вам нужно. Я предпочитаю разделять проблемы, поэтому, если frontend и backend делать разные вещи в другой среде, объединение их в один может привести к путанице. И сколько frontend нагрузки backend и сколько оперативной памяти им нужно? Если у вас больше посетителей / обращений к интерфейсу (как я мог себе представить), вы можете захотеть запустить два или более контейнеров для обработки запросов. Если это означает, что вам всегда нужно включать ресурсы, необходимые для серверной части, это было бы плохой идеей. не зная никаких подробностей, я бы выбрал более 1 изображения.

3. в общем, у меня были те же причины, что и у вас. но в моем офисе мы спорим с коллегами, поэтому я решаю тоже спросить здесь. Итак, в общем, если вы хотите предоставить только имя сервера виртуального хоста, вы должны делать это в отдельном прокси-контейнере, или это будет частью внутренних и внешних контейнеров.

4. Я рассматриваю контейнеры docker как сервисы с портами для ввода и вывода. Конец. Обработка фронтального веб-сервера, маршрутизации, сертификатов TLS и т. Д. — Это чужая работа. Итак, да, нет server_name в контейнерах приложений.

5. Нет, но если вы включите server_name в свой образ приложения, вы ограничитесь одним запущенным контейнером. Нет масштабирования, нет балансировки нагрузки. Похоже, вы путаете docker и виртуальные машины. Это службы, а не хосты.