Контейнер Docker и потребление памяти

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

Как докер справляется с этим?

Все ли контейнеры докеров совместно используют статическую часть, определенную в образе докера?

Если нет, имеет ли смысл копировать приложение в какой-либо каталог на машине, которая используется для запуска контейнеров докеров, и монтировать этот каталог приложения для каждого контейнера докеров?


person Michael Belenki    schedule 11.07.2014    source источник


Ответы (1)


Docker разделяет ресурсы на уровне ядра. Это означает, что логика приложения никогда не реплицируется при запуске. Если вы запускаете блокнот 1000 раз, он по-прежнему сохраняется только один раз на вашем жестком диске, то же самое относится и к экземплярам докеров.

Если вы запускаете 100 экземпляров одного и того же образа докера, все, что вы на самом деле делаете, — это сохраняете состояние одной и той же части программного обеспечения в вашей оперативной памяти на 100 разных временных шкалах. Процессор(ы) хоста изменяет состояние памяти каждого из этих экземпляров контейнера в соответствии с управляющим им программным обеспечением, поэтому вы ДЕЙСТВИТЕЛЬНО потребляете в 100 раз больше оперативной памяти, необходимой для запуска приложения. Нет смысла физически хранить один и тот же байт-код для программного обеспечения 100 раз, потому что эта часть приложения всегда статична и никогда не изменится. (Если только вы не напишете какое-нибудь сумасшедшее самоизменяющееся программное обеспечение или не решите пересобрать и повторно развернуть образ своего контейнера)

Вот почему контейнеры не допускают персистентность «из коробки», и чем Docker отличается от обычных виртуальных машин, использующих виртуальные жесткие диски. Однако это верно только для персистентности внутри контейнера. Файлы, которые изменяются программным обеспечением докеров на жестком диске, «монтируются» в контейнеры с использованием томов докеров и, таким образом, на самом деле не являются частью сред докеров, а просто монтируются в них. (Подробнее об этом читайте по адресу: https://docs.docker.com/userguide/dockervolumes/)

Другой вопрос, который вы, возможно, захотите задать, когда будете думать об этом, заключается в том, как докер сохраняет изменения, которые он вносит на свой диск во время выполнения. Что действительно приятно проверить, так это то, как докеру удается заставить это работать. Исходное состояние жесткого диска контейнера — это то, что ему дано из образа. Он может НЕ записывать в это изображение. Вместо записи в образ выполняется сравнение того, что изменилось во внутреннем состоянии контейнера, по сравнению с тем, что находится в образе докера. Docker использует технологию под названием «Union Filesystem», которая создает слой различий поверх начального состояния образа Docker.

Этот «diff» (обозначенный как перезаписываемый контейнер на изображении ниже) хранится в памяти и исчезает, когда вы удаляете свой контейнер. (Если вы не используете команду «docker commit», однако: я не рекомендую это делать. Состояние вашего нового образа докера не представлено в файле докера и не может быть легко восстановлено из перестроения)

Union Filesystem

person RoyB    schedule 07.08.2014