Подтвердить что ты не робот

Контейнер докеров и потребление памяти

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

Как работает докер?

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

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

4b9b3361

Ответ 1

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

Если вы запускаете 100 экземпляров одного и того же изображения докеров, все, что вы действительно делаете, это поддерживать состояние одного и того же программного обеспечения в вашей ОЗУ в 100 разных разделенных временных ракурсах. Процессор хостов изменяет состояние памяти в каждом из этих экземпляров контейнера в соответствии с программным обеспечением, контролирующим его, поэтому вы потребляете 100 раз оперативную память, необходимую для запуска приложения. Нет никакого смысла физически хранить тот же самый байт-код для программного обеспечения 100 раз, потому что эта часть приложения всегда статична и никогда не изменится. (Если вы не пишете какую-то сумасшедшую самонастраивающуюся часть программного обеспечения, или вы решили перестроить и переустановить образ контейнера)

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

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

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

Union Filesystem