#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 и виртуальные машины. Это службы, а не хосты.