Несколько изображений внутри одного контейнера

Итак, вот проблема, мне нужно сделать некоторую разработку, и для этого мне нужны следующие пакеты:

  1. MongoDb
  2. NodeJs
  3. Nginx
  4. RabbitMQ
  5. Redis

Один из вариантов заключается в том, что я беру образ Ubuntu, создаю контейнер и начинаю устанавливать его один за другим и делать, запускать свой сервер и открывать порты.

Но это также можно легко сделать и в виртуальной коробке, и она не будет использовать силу Docker. Поэтому для этого я должен начать создавать свой собственный образ с помощью этих пакетов. Теперь вот вопрос, начинаю ли я писать свой файл Dockerfile и размещать команды для загрузки Node js (и других) внутри него, это снова становится тем же, что и виртуализация.

Мне нужно, чтобы я начал с Ubuntu и продолжал добавлять ссылки MongoDb, NodeJs, RabbitMq, Nginx и Redis внутри Dockerfile и, наконец, выставлять соответствующие порты.

Вот мои запросы:

  1. Это возможно? Как и добавление репрезентаций других изображений внутри файла Docker, когда вы начинаете с одного базового изображения.
  2. Если да, то как?
  3. Также это правильная практика или нет?
  4. Как это делать в Докере?

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

Ответ 1

Держите изображения светлыми. Запустите один сервис на контейнер. Используйте официальные изображения на докер-хабе для mongodb, nodejs, rabbitmq, nginx и т.д. Расширьте их, если необходимо. Если вы хотите запустить все в контейнере с жиром, вы можете просто использовать виртуальную машину.

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

Не делайте монолитные контейнеры.

Хорошим началом является использование команды docker-compose для настройки набора сервисов, которые могут разговаривать друг с другом. Вы можете сделать prod и dev версию вашего файла docker-compose.yml.

Переход в правильное настроение

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

Некоторые моменты, о которых нужно подумать, если вы хотите быть пуристом:

  • Как у вас есть постоянное хранилище томов на нескольких хостах?
  • Reverse proxy/load balancer должен, вероятно, быть точкой входа в систему, которая разговаривает с контейнерами, используя внутреннюю сеть.
  • Является ли мой сервис даже способным работать в кластерной среде (несколько экземпляров контейнера)

Конечно, вы можете делать грязные вещи в dev, такие как сопоставление в томах хоста для постоянного хранения (и многие люди, которые используют докеры отдельно в prod, тоже это делают).

В идеале мы должны разделить докер в dev и docker я prod. Docker - это фантастический инструмент во время разработки, так как вы можете использовать redis, memcached, postgres, mongodb, rabbitmq, node или whatnot up and running in minutes sharing, которые составляют настройку с остальной частью команды. Докер в prod может быть совершенно другим зверем.

Я также хотел бы добавить, что я вообще против фанатизма, что "все должно работать в докере" в prod. Запускайте службы в докер, когда это имеет смысл. Также нередко для крупных компаний создавать свои собственные базовые изображения. Это может быть много работы и потребует обслуживания, чтобы идти в ногу с исправлениями безопасности и т.д. Это не обязательно первое, что вы прыгаете, когда начинаете с докеров.