Как мне докеризировать этот стек MEAN в соответствии с этой архитектурой?

Я новичок в Докере.

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

План

Я хочу иметь возможность иметь некоторое количество изолированных док-контейнеров с текущим программным обеспечением на борту:

  • NodeJs (npm, pm2, grunt-cli и т. д.)
  • монгодб
  • другое программное обеспечение (cron, ffmpeg и т. д.)

Каждый изолированный контейнер связан с одним и тем же томом с кодом приложения, но запускается с разными переменными ENV: портом expressJS, именем базы данных и т. д. Вы меня поняли, верно?

Например, у нас есть 2 изолированных контейнера: stack1 и stack2.

Оба они используют один и тот же том с кодом приложения, расположенным в /home/user/app_code/ (подключение тома) на хост-компьютере.

NodeJS внутри stack1 запускается на порту 3001 и подключается к своему серверу mongoDB, который использует БД в /home/user/db1 (подключение тома) и имеет выделенное хранилище для мультимедиа, расположенное в /home/user/storage1.

NodeJS внутри stack2 запускается на порту 3002 и подключается к своему серверу mongoDB, который использует БД в /home/user/db2 (подключение тома) и имеет выделенное хранилище для мультимедиа, расположенное в /home/user/storage2.

И, конечно же, stack1 и stack2 размещаются за обратным прокси-сервером с одним контейнером Nginx.

Вопрос

Как лучше реализовать мой план?

Насколько я понимаю, docker-compose не подходит в моем случае. В конце концов я могу построить только стек, состоящий из изображения nodeJs и изображения Mongo. Но как быть с ffmpeg и cron? Как умножить стеки? Можно ли разместить их за одним контейнером Nginx?

Второй способ — взять "phusion/baseimage-docker", вручную установить NodeJs, Mongodb, ffmpeg, размножьте этот контейнер и спрячьте каждый за прокси Nginx revese. Но этот подход немного нарушает рекомендации по написанию файлов Dockerfile. (Запускать только один процесс на контейнер)

Или есть другой правильный способ? Как бы вы реализовали эту архитектуру?

Заранее спасибо!

архив


person Alex    schedule 28.08.2016    source источник


Ответы (1)


Это, конечно, не элегантно, но вы можете сделать это с помощью docker-compose. Вам просто нужно будет создать копии каждой службы. например:

version: "2"
services:
  stack1_node:
    ...
  stack1_mongo:
    ...
  stack1_software:
    ...
  stack2_node:
    ...
  stack2_mongo:
    ...
  stack2_software:
    ...

Это короткий ответ. Более длинный ответ заключается в том, что то, что вы описываете, называется pod в Kubernetes или task в AWS ECS. Они представляют собой группу контейнеров, которые образуют единое целое. Новый докер «режим роя» также имеет понятие задачи, но в настоящее время он обрабатывает только один контейнер. Я не сомневаюсь, что в ближайшие несколько месяцев они продлят его, чтобы справиться с тем, что вы описываете. Они воруют идеи отовсюду, как им и положено.

person Bernard    schedule 28.08.2016
comment
Благодарю вас! Тогда я вернусь к концепции контейнеров EC2. Честно говоря, я попробовал Amazon Container Service, но не понял, как заставить все работать... Как насчет концепции базового образа докера? - person Alex; 28.08.2016
comment
Да, докер, конечно, не такой зрелый, но он проще, и вы не привязываетесь к такому провайдеру, как AWS. - person Bernard; 28.08.2016