Многоуровневые файловые системы и монтирование томов

Мне трудно понять, как использование томов для хранения повлияет на использование дискового пространства.

У меня есть изображение A, которое является базовым и содержит множество утилит, необходимых моим приложениям. У меня есть приложения B и C, которые представляют собой образы, созданные из базового образа A. Они устанавливают разные языки для запуска двух моих разных приложений. Изображение A составляет 300 МБ, а B и C — по 300 МБ.

Если я создам 10 экземпляров приложений A и B, сколько места на диске будет использовано?

Также предположим, что я монтирую общий ресурс NFS во все контейнеры, любые приложения/процессы в контейнерах только когда-либо записывают данные приложений, журналы и т. д. в смонтированный общий ресурс nfs, поэтому, похоже, в контейнере не происходит записи. Точка монтирования /var/www/html как будет выглядеть использование моего диска?

Как я сейчас понимаю, в первом случае использование моего диска будет (300 МБ для базового образа + 600 МБ для двух образов приложений, которые строятся на нем, поэтому 900 МБ. Я предполагаю, что базовый образ будет общим. Если какие-либо контейнеры созданные из образов приложений B и C, и каждый из них записывает данные по 100 МБ перед очисткой. Тогда мое общее использование диска будет 900 МБ + 100 МБ (чистые данные, записанные на диск) * количество контейнеров?

Как я это понимаю?


person Jonathan    schedule 02.09.2016    source источник


Ответы (1)


Многоуровневая файловая система будет повторно использовать слои из родительских образов, поэтому, если образ A имеет размер 300 МБ, а приложения B и C — по 300 МБ, то на самом деле эти контейнеры приложений добавляют почти 0 дискового пространства, повторно используя все содержимое родительского образа. Поскольку все данные хранятся снаружи и запись в локальную файловую систему RW контейнера не производится, вы можете раскрутить столько из них, сколько захотите, и использовать только 300 МБ на диске.

Если каждое из этих приложений на самом деле добавляет 300 МБ, и эти 300 МБ отличаются от родительского и других контейнеров приложений (docker использует кэширование, которое может позволить каждому контейнеру приложения повторно использовать другой, если они выполняют одни и те же команды ), тогда вы получите каждое изображение размером 600 МБ, в то время как фактический размер используемого диска будет 900 МБ, 300 МБ для родительского и 300 МБ для каждого образа приложения.

Запуск каждого контейнера не увеличивает используемое дисковое пространство до тех пор, пока этот контейнер не запишет файлы на локальный том или уровень RW контейнера.

Понимание этого входит в структуру многоуровневой файловой системы. Образ может состоять из нескольких слоев, каждый из которых создается один раз и может повторно использоваться другими образами, все хранится как ссылки на хеш, и только когда больше нет ссылок на хэш, докер удалит этот слой на docker rmi .

Когда вы превращаете образ в контейнер (с docker run или даже docker create), содержимое образа монтируется как слои только для чтения, при этом слой RW для контейнера монтируется поверх, а любые тома монтируются поверх многоуровневой файловой системы. Чтение за пределами тома проходит через слои, пока не достигнет одного с файлом (или какой-либо другой модификации файла, например его удаления). Таким образом, если файл не был изменен, он читается из одного из слоев изображения, но если вы создадите его в слое RW, ваше чтение вернет его обратно. Это приводит к концепции неизменяемости изображений, в то время как каждый контейнер может хранить свои собственные изменения в течение всего срока службы контейнера. Вы можете запустить docker diff для контейнера, чтобы узнать, какие изменения были внесены в его слой RW. Эта разница — это то, что вы сохраняете в слое изображения на каждом этапе сборки или в файле docker commit.

person BMitch    schedule 02.09.2016
comment
Спасибо. Итак, с сетевым файловым сервером для записи я мог бы запускать неограниченное количество контейнеров на своей машине? - person Jonathan; 02.09.2016
comment
Без ограничений, если у вас есть неограниченная память для каждого процесса. Будут некоторые теоретические ограничения на файловые дескрипторы и сетевое адресное пространство, но у вас закончится память или мощность ЦП, прежде чем вы их достигнете. - person BMitch; 02.09.2016
comment
Слишком хорошо, чтобы быть правдой :-). Спасибо. Приложения A и B — это разные несхожие изображения, поэтому их общий размер составит 900 МБ. - person Jonathan; 02.09.2016