yokotoka
@yokotoka
Python guru

Почему так не делают в docker (all-in-one чёрный ящик)?

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

Для этого вникаю в docker и начал собирать свои образы для платформ, которые использую.

И почти везде вижу советы, вида "создайте 2 контейнера: один для вашего приложения, другой контейнер для базы данных, а потом слинкуйте их" и пока ни разу - запихните всё, и базу и приложение в один контейнер. И тут я впадаю в ступор. Если основной посыл Docker'а "контейнеризация позволяет переносить и запускать в любой среде ваши приложения со всеми зависимостями", то какой тогда смысл в Docker, если мы опять разбиваем приложение на куски, имея весь тот геморой, который мы имели, когда докера не было?

Каким я вижу best-way:
  1. Берём baseimage
  2. Строим на его основе контейнер, в котором есть всё для запуска полнофункционального приложения - и база, и nginx и нужные библиотеки
  3. Если надо, то даём приложению возможность лазить куда-нибудь на S3/внешнуюю базу (как правило, не надо)
  4. Делаем data volume на основе этого образа в среде, где будем запускать (если в первый раз, или восстанавливаем из бекапа), на этот data-volume пишутся все последующие изменения - растёт база, хранятся файлы, создаваемые приложением и т.п.
  5. Запускаем контейнер и радуемся жизни
Из плюсов: независимость от внешней среды, лёгкий и удобный бекап и восстановление/перенос через перетаскивание только data-volume, куча разных приложений не хранит свои данные в одной базе (отсюда нет гемороя с переносом/бекапом/взломом или потерей всего при крахе контейнера с базой), наружу торчит только порт сервиса, через который идёт с ним взаимодействие как с "чёрным ящиком" и ничто не мешает сервису лазить наружу за чем-нибудь, что ему может понадобиться.
Минусы: повышенный расход памяти и диска (но это терпимо в моём случае).

Мой вопрос - почему во всём инете я практически не нашёл упоминания такого подхода? Что с ним может быть не так, и каких подводных камней я не увидел?
  • Вопрос задан
  • 1561 просмотр
Решения вопроса 2
Fesor
@Fesor
Full-stack developer (Symfony, Angular)
если мы опять разбиваем приложение на куски, имея весь тот геморой, который мы имели, когда докера не было?


Отчего же? Ваше приложение может работать под арчем используя одни либы, используя при этом базу данных которая крутится под дебианом, при этом вы не паритесь о каких-то других вещах. Если вам нужна база данных - вы просто используете контейнер с оной как черный ящик. А с учетом того что у нас есть docker-compose разворачивать такую систему вообще не проблема, просто запускаем docker-compose up и все. Мы добились того же что можно было бы сделать используя один контейнер, но всю систему намного проще поддерживать.

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

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

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

А ну и еще - ваш подход плохо подходит для масштабирования. Скажем я хочу что бы у меня база данных крутилась на отдельном кластере серверов, а приложение на другом. И тут мы проигрываем.
Ответ написан
yokotoka
@yokotoka Автор вопроса
Python guru
На SO народ говорит, что особого криминала в этом нет. Если приложухи небольшие, то этот подход - ОК. Проблемы будут когда понадобится скейлить, но и они решаемы. В общем, вроде так можно, если понимать возможные последствия и ограничения.
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 1
opium
@opium
Просто люблю качественно работать
вы путаете виртуализацию приложения с виртуализацией операционной системы
идеология у докера первая, а вы мыслите виртуалками и пытаетесь привить ему подход стандартной виртуализации.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы