Страницы

Поиск по вопросам

среда, 5 февраля 2020 г.

Зависимости в docker и место на диске

#docker


Правильно ли я понимаю, что каждый образ тащит в зависимостях свою собственную ОС
(дебианы всех версий, убунты всех версий, alpin'ы всех версий, что там ещё есть), из-за
чего куча разных образов очень быстро сожрут свободное место на диске? 
    


Ответы

Ответ 1



Да, вы получите образы всех (почти-)ОС Из зависимостей всех ваших образов. Нет, это не съест весь ваш диск в один момент. Во-первых, Docker старается избегать дублирования данных с помощью драйверов хранения (storage drivers). Большинство образов Docker основано на каких-то других образах (директива FROM в Dockerfile). И как правило, файлы, которые из одного образа унаследовались другими без изменений, будут размещены на диске всего раз. Как именно и как будет организована работа с такими файлами — зависит от драйвера. На странице о драйверах можно почитать о технических подробностях каждого из них, для примера: Aufs представляет файловую систему контейнера в виде объединения слоёв, начиная с базового (только для чтения), через промежуточные (только для чтения) и заканчивая собственным слоем контейнера (доступным для записи). ZFS размещает базовую файловую систему прямо на устройстве хранения, а каждый очередной слой (включая собственный слой контейнера) накладывается в виде клона (clone) из снимка (snapshot) предыдущего слоя. История файлов хранится лишь по одной версии для слоя. То есть, если при сборке слоя файл был изменён дважды, сохранится лишь последняя версия. Если был создан и удалён, то в слое не будет упоминаний о нём вовсе. Удаление файлов из исходного образа реализуется путём "замазывания" (whiteout) файлов специальными записями. Во-вторых, в образах ОС для Docker, по сравнению с серверными ОС (чтобы сразу исключить из рассмотрения GUI и связанные вещи), многих вещей нет за ненадобностью: Инит-процесса и его аксессуаров. Docker стартует сразу процесс с "полезной нагрузкой", бывает что через оболочку, занимающую PID 1. Собственное ядро и утилиты для его обслуживания. Всё равно используется ядро хост-машины. Поэтому контейнеры так привязаны к ОС, на которой построены. Демонов. Хорошей практикой считается держать в каждом контейнере ровно один процесс, поэтому файлы, связанные с демонами (почтовый агент, базы данных, системы автоообновления, и т. п.), можно выбросить. Кому надо будет — поставит самостоятельно, но это редко нужно. Устаревающих файлов, вроде списков пакетов из репозиториев. Их всё равно надо будет заменить свежими версиями при наследовании образа, поэтому включать их в образ бесполезно. Популярная проблема при формировании контейнеров: пакеты не устанавливаются, если в докерфайле явно не потребовать обновить списки пакетов из репозиториев. Достаточно часто в контейнерах используется Alpine Linux, контейнерная версия которого занимает чуть больше 4 мегабайт (но при наследовании она чуть прибавляет в весе за счёт временных файлов). Для сравнения, его же самостоятельный установочный образ для полноценных систем занимает чуть больше 100 мегабайт. Другие контейнерные дистрибутивы потолще будут, но и они по сравнению со своими полновесными собратьями гораздо компактнее.

Ответ 2



Да, верно. Против этого работает дедупликация образов и использование более компактных базовых образов вроде alpine. Плюс из образов стараются выкидывать всё лишнее: к примеру, ядро и связанные с его обслуживанием утилиты, т. к. используется в итоге ядро хоста. Так что место на диске сжирается не шибко быстро, но безусловно быстрее, чем при ручной настройке продуктов из образов без докера на одной системе. Дополнительно об освобождении места можно прочитать здесь.

Комментариев нет:

Отправить комментарий