Назад | Перейти на главную страницу

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

Задний план

В настоящее время я работаю над созданием приложения, которое хочу развернуть в контейнерах Docker.

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

На данный момент различные части / контейнеры:

Мысли

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

Это можно решить, создав одно изображение для каждого приложения. Так что вышеупомянутые услуги будут частью одного изображения. В первую очередь противоречит ли это общей безопасности или цели Docker?

Разъяснение

Конфликтует ли наличие нескольких сервисов в одном образе Docker с целью Docker?

Будут ли удалены общие преимущества безопасности контейнеров при запуске служб из одного образа?

Сами Docker ясно дают понять: от вас ожидается запуск один процесс на контейнер.

Но их инструменты для работы со связанными контейнерами оставляют желать лучшего. Они действительно предлагают docker-compose (который раньше назывался fig), но мои разработчики сообщают, что он привередлив и иногда теряет отслеживание связанных контейнеров. Он также плохо масштабируется и действительно подходит только для очень небольших проектов.

Сейчас я думаю, что лучшим доступным решением является Kubernetes, проект Google. Kubernetes также является основой последней версии Openshift Origin, платформу PaaS, а также Google Container Engine и, возможно, что-то еще. Если вы используете Kubernetes, вы сможете легко выполнить развертывание на таких платформах.

Docker действительно дает понять, что они считают, что один процесс на контейнер является «правильным» способом, но никогда не дает никаких оправданий. Мой ответ: это зависит от обстоятельств. В этом конкретном случае я бы разделил их и управлял с помощью Kubernetes или OpenShift, потому что это тривиально и дает вам возможность масштабировать каждую часть вашего приложения независимо.

Я бы не сказал, что это правило, что вы ДОЛЖНЫ разделить свое приложение на части. Запущенные контейнеры - это, по сути, системный вызов clone (), cgroups и selinux, что означает, что вы можете запускать более одного процесса для каждого контейнера. Docker, LXC, доморощенные, не имеет значения, когда они запущены. LXC поощряет использование нескольких процессов для каждого контейнера, поэтому я бы сказал, что «один процесс на контейнер» - это философия, а не разработка.

http://rhelblog.redhat.com/2016/03/16/container-tidbits-when-should-i-break-my-application-into-multiple-containers/