У нас есть довольно сложное приложение Rails, которое будет развернуто на одном физическом хосте. Хост имеет 8 ядер и 128 ГБ оперативной памяти.
Приложение докеризовано, с 4 типами контейнеров
Ожидается, что контейнеры Rails и Worker будут масштабированы за счет добавления большего количества контейнеров в docker-machine.
В среде разработки память распределяется на всю докер-машину:
docker-machine create -d virtualbox --virtualbox-memory 8192 default
Можно ли контролировать, какой объем памяти ограничен отдельными контейнерами?
Например, выделите 16 ГБ для Postgres, но ограничьте контейнеры Rails до 4 ГБ. Какой минимальный объем памяти следует выделить хосту сервера, на котором запущена машина-докер, и возможно ли это вообще?
РЕДАКТИРОВАТЬ
Связанные вопросы:
Как справиться с управлением памятью Docker?
Docker + Apache, как работает использование памяти?
РЕДАКТИРОВАТЬ 2
Этот ответ https://serverfault.com/a/645888/210752 указывает, что контейнеры будут выделять память по мере необходимости. У меня не было такого опыта в среде разработки (по умолчанию докер-машине было выделено 2 ГБ).
Как уже упоминалось в ответе на вопрос во втором редактировании, контейнеры не похожи на виртуальные машины тем, что вы обычно не резервируете для них память, как в случае с виртуальными машинами. Поскольку все они работают в одной ОС, он может распределять память по разным процессам, как если бы они не выполнялись в контейнере. То есть память объединяется для всех процессов, независимо от контейнеров.
То, что вы установили в приведенном выше примере с помощью docker-machine, было общим пулом памяти «виртуального» хоста. В вашем производственном случае это будут все 128 ГБ (если вы не планируете также использовать докер-машину или виртуальные машины для его сегментации).
Однако контейнеры также являются отличным способом использования возможностей ядра. cgroups (группы управления), которые позволяют настраивать управление ресурсами для всей контейнерной системы. Это не позволяет вам `` зарезервировать '' память для контейнера, но вместо этого вы можете установить верхние границы для всей памяти ваших контейнеров, чтобы не поглощать память, которая может быть использована для других (например, в случае утечки или ошибки ).
В Docker, в зависимости от используемой серверной части контейнера, вы можете установить базовые ограничения памяти следующим образом:
Вы можете найти больше информации об использовании cgroups в Docker здесь: https://www.cloudsigma.com/manage-docker-resources-with-cgroups/
В статье также есть слайды, знакомящие с функциями cgroups.