Выделение памяти docker-machine

У нас есть довольно сложное приложение Rails, которое вот-вот будет развернуто на одном физическом хосте. Хост имеет 8 ядер и 128 ГБ оперативной памяти.

Приложение является докеризованным, с 4 типами контейнеров

  • Rails inc. веб-сервер
  • Postgres DB
  • Redis DB
  • Рабочий контейнер (Resque)

Ожидается, что Rails и рабочие контейнеры будут масштабироваться за счет добавления большего количества контейнеров в docker-machine.

В среде разработки память выделяется для всей докер-машины:

docker-machine create -d virtualbox --virtualbox-memory 8192 default

Можно ли контролировать, каким объемом памяти ограничены отдельные контейнеры?

Например, выделите 16 ГБ для Postgres, но ограничьте контейнеры Rails 4 ГБ. Какой минимальный объем памяти должен быть выделен хосту сервера, на котором работает docker-machine, и возможно ли это вообще?

РЕДАКТИРОВАТЬ

Связанные с этим вопросы:

Как справиться с управлением памятью Docker?

Docker + Apache, как работает использование памяти?

ПРАВКА 2

Этот ответ https://serverfault.com/a/645888/210752 указывает, что контейнеры будут выделять память по мере необходимости. Такого у меня не было в среде разработки (по умолчанию докер-машине было выделено 2 ГБ).

Как упоминалось в ответе на вопрос в вашей 2-й правке, контейнеры не похожи на виртуальные машины в том смысле, что вы обычно не резервируете для них память, как это было бы с виртуальными машинами. Поскольку все они работают в одной и той же ОС, он может распределять память по мере необходимости между разными процессами, как если бы они не выполнялись в контейнере. То есть память объединяется для всех процессов, независимо от контейнеров.

То, что вы установили в приведенном выше примере с помощью docker-machine, было общим пулом памяти "виртуального" хоста. В вашем производственном случае это будет целых 128 ГБ (если только вы не планируете также использовать docker-machine или виртуальные машины для его сегментации).

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

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

  • При запуске libcontainer docker по умолчанию, запустив контейнеры с - м или - память вариант
  • При запуске устаревшего поставщика LXC, запустив контейнеры с опцией LXC lxc.cgroup.cpuset.memory=сумма, использующая --lxc-conf

Вы можете найти более подробную информацию об использовании групп в Docker здесь:https://www.cloudsigma.com/manage-docker-resources-with-cgroups/

Статья также содержит слайды с введением в функциональные возможности cgroups.

@ardochhigh Ну, я не могу отказаться от своего закрытого голосования или ответить на ваш вопрос, так что … извините за это. Надеюсь, кто-нибудь другой сможет.

@HopelessN00b никаких проблем… Я думаю, что вопрос был сформулирован не так хорошо с самого начала. Я много работал с инфраструктурой, но Docker для меня в новинку. Я назначил награду… хорошего вам дня!