Должен ли я использовать отдельные контейнеры Docker для своего веб-приложения?

Нужно ли использовать отдельный контейнер Docker для моего сложного веб-приложения, или я могу разместить все необходимые сервисы в одном контейнере? Может ли кто-нибудь объяснить мне, почему я должен разделить мое приложение на многие контейнеры (например, контейнер php-fpm, контейнер mysql, контейнер mongo), когда у меня есть возможность установить и запустить все вещи в одном контейнере?

Ответ 1

Что-то, о чем нужно думать при работе с Docker, это то, как он работает внутри. Docker заменяет ваш PID 1 командой, указанной вами в директиве CMDENTRYPOINT, которая немного сложнее) в вашем файле Docker. PID 1 обычно находится в вашей системе init (sysvinit, runit, systemd, что угодно). Ваш контейнер живет и умирает тем, что там начат. Когда процесс умирает, ваш контейнер умирает. Stdout и stderr для этого процесса в контейнере - это то, что вы даете на главной машине при вводе docker logs myContainer. Кстати, вот почему вам нужно прыгать через обручи, чтобы запускать службы и запускать cronjob (что обычно делает ваша система init). Это очень важно для понимания мотивации делать вещи определенным образом.

Теперь вы можете делать все, что хотите. Есть много мнений о "правильном" способе сделать это, но вы можете выбросить все это и сделать то, что хотите. Таким образом, вы МОЖЕТЕ выяснить, как запустить все эти службы в одном контейнере. Но теперь, когда вы знаете, как docker заменяет PID 1 любой командой, указанной вами в CMDENTRYPOINT) в ваших файлах Docker, вы можете подумать, что разумно пытаться поддерживать ваши приложения в каждом контейнере и позволять им работайте друг с другом с помощью привязки контейнеров. (Обновление) - 27 апреля 2017 года. Контейнерная ссылка устарела в пользу регулярной ole контейнерной сети, что много более надежным, идея состоит в том, что вы просто присоединяетесь к отдельным контейнерам приложений к одной и той же сети, чтобы они могли разговаривать друг с другом).

Если вы хотите немного помочь решить, я могу сказать вам по собственному опыту, что он становится намного чище и проще в обслуживании, когда вы откладываете свои приложения в отдельных контейнерах, а затем связываете их вместе. Только сейчас я создаю установку Wordpress из HHVM, и я устанавливаю Nginx и HHVM/php-fpm с установкой Wordpress в одном контейнере и материал MariaDB в другом контейнере. В будущем это позволит мне перейти на замену Wordpress непосредственно перед моими данными MariaDB практически без хлопот. Стоит использовать контейнер для каждого приложения. Удачи!

Ответ 2

Когда вы делите веб-приложение на многие контейнеры, вам не нужно перезапускать все службы при развертывании приложения. Как обычно, вы не перезагружаете свой сервер mysql при обновлении веб-слоя.

Также, если вы хотите масштабировать приложение, проще, если ваше приложение разделено на отдельные контейнеры. Затем вы можете просто масштабировать те части приложения, которые необходимы для решения ваших узких мест.

Ответ 3

Некоторые скажут вам, что вы должны запустить только 1 процесс на контейнер. Другие скажут, 1 заявка на контейнер. Эти советы основаны на принципах микросервисов.

Я не верю, что микросервисы - правильное решение для всех случаев, поэтому я бы не стал слепо следовать этим советам только по этой причине. Если для вашего случая имеет смысл иметь несколько процессов в одном контейнере, сделайте это. (См. Супервизор и базовый образ Phusion по этому вопросу)

Но есть и еще одна причина для разделения контейнеров: в большинстве случаев это меньше работы для вас.

На Docker Hub имеется множество готовых к использованию образов Docker. Просто возьмите те, которые вам нужны.

То, что вам остается сделать, это:

  • прочитайте документацию для этих образов докера (какую переменную окружения установить и т.д.)
  • создайте файл docker-compose.yml для упрощения работы с этими контейнерами

Ответ 4

Вероятно, лучше иметь ваш webapp в одном контейнере и ваших вспомогательных сервисах, таких как базы данных и т.д. в отдельных контейнерах. Делая это, если вам нужно выполнить скользящие обновления или перезагрузки, вы можете сохранить свою базу данных онлайн, пока ваши узлы приложений выполняют отдельные перезагрузки, поэтому вы не будете испытывать простои. Если у вас есть кеширование с чем-то вроде Redis и т.д., Это также полезно по той же причине. Это также позволит вам более легко добавлять узлы к масштабированию в связном режиме. Это также позволит вам управлять контейнерами более подходящим образом для конкретной цели. Для типа приложения, которое вы описываете, я вижу очень мало аргументов для запуска всех служб в одном контейнере.

Ответ 5

Это зависит от видения и дорожной карты для вашего приложения. Включение всех компонентов приложения в один уровень в этом случае. Докер-контейнер похож на помещение всех яиц в одну корзину.

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