Что такое драйверы хранилища Docker и какие следует использовать? — CloudSavvy ИТ

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

Для чего нужны драйверы хранилища?

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

Драйверы хранилища внутренне связаны с «доступным для записи слоем» контейнера. Этот термин относится к самому верхнему уровню файловой системы контейнера, который вы можете изменять, выполняя команды, записывая файлы и добавляя программное обеспечение во время выполнения.

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

Все эти операции приводят к тому, что файловая система работающего контейнера отличается от той, которая определена его образом. Выбранный вами драйвер хранилища устраняет несоответствие и учитывает разницу.

Что происходит, когда вы запускаете контейнер?

Когда запускается новый контейнер, Docker сначала извлекает слои изображения, созданные путем построения его файла Dockerfile. Слои сохраняются на вашем хост-компьютере, поэтому вам не нужно снова загружать изображение, пока вы не захотите получить обновления. В рамках процесса извлечения Docker идентифицирует и повторно использует слои, которые у него уже есть, избегая избыточных загрузок.

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

Схема, показывающая, как работают доступные для записи слои DockerDocker.com

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

Подход Docker заключается в «копировании при записи», то есть файл копируется из исходного слоя в доступный для записи уровень в момент модификации. Это операция с интенсивным вводом-выводом, которая может привести к снижению производительности.

Различные драйверы хранилища несут ответственность за реализация поддержки копирования при записи. Каждый драйвер предлагает уникальный компромисс между производительностью и эффективностью использования диска.

Доступные драйверы хранилища

Docker использует архитектуру подключаемого драйвера хранилища и по умолчанию предоставляет несколько параметров. Драйверы хранилища не влияют на отдельные образы или контейнеры — вы можете запустить любой образ Docker независимо от выбранного драйвера.

Активный драйвер хранилища — это параметр уровня выполнения, который определяется в файле конфигурации демона Docker. Некоторые драйверы хранилища требуют специальной подготовки файловой системы, прежде чем вы сможете их использовать. Затем вы добавляете выбранный драйвер хранилища в /etc/docker/daemon.json:

{«драйвер хранилища»: «оверлей2»}

Вы можете проверить текущий драйвер, запустив docker info | grep «Драйвер хранилища». В большинстве современных систем по умолчанию используется overlay2.

Вот краткое изложение возможных вариантов.

overlay2

Драйвер overlay2 теперь используется по умолчанию во всех активно поддерживаемых дистрибутивах Linux. Для этого требуется резервная файловая система ext4 или xfs.

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

Как только файл найден, он копируется на доступный для записи уровень контейнера. Затем копия модифицируется с изменениями, запрошенными контейнером. С этого момента контейнер видит только новую скопированную версию файла. Оригинал в нижнем слое изображения становится непрозрачным для контейнера.

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

Альтернативы этому драйверу включают aufs и более старый оверлей. Ни один из них не рекомендуется для использования в современных дистрибутивах Linux, где поддерживается overlay2.

btrfs и zfs

Эти два драйвера работают на уровне блоков и идеально подходят для операций с интенсивной записью. Каждому из них требуется соответствующая резервная файловая система.

Использование этих драйверов приводит к тому, что ваш каталог / var / lib / docker хранится на томе btrfs или zfs. Каждый слой изображения получает свой собственный каталог в папке вложенных томов. Пространство выделяется каталогам по требованию по мере необходимости, что позволяет поддерживать низкий уровень использования диска до тех пор, пока не будут выполнены операции копирования при записи.

Базовые слои изображения хранятся в файловой системе в виде подтомов. Другие слои становятся снимками, содержащими только те различия, которые они вносят. Изменения записываемого уровня обрабатываются на уровне блоков, добавляя еще один снимок с экономией места.

Вы можете создавать снимки подобъектов и другие снимки в любое время. Эти моментальные снимки продолжают обмениваться неизмененными данными, сводя к минимуму общее потребление памяти.

Использование одного из этих драйверов может улучшить работу с контейнерами, интенсивно использующими запись. Если вы пишете много временных файлов или кешируете много операций на диске, btrfs или zfs могут превзойти overlay2. Тот, который вам следует использовать, зависит от вашей файловой системы резервного копирования — обычно zfs предпочтительнее как более современная альтернатива btrfs.

накладки-предохранители

Этот драйвер хранилища позволяет запускать Docker в режиме без root на компьютере, на котором отсутствует поддержка драйвера overlay2. Однако, поскольку все текущие целевые дистрибутивы Linux теперь работают с overlay2, fuse-overlayfs больше не требуется и не рекомендуется.

Этот водитель работает путем реализации наложенной файловой системы с помощью FUSE. Как файловая система пользовательского пространства, она работает в режиме без root, но снижает производительность по сравнению с системой хранения на уровне ядра.

vfs

Драйвер vfs включен только в целях тестирования и не должен использоваться в производственной среде. Документально подтверждена низкая производительность этого драйвера.

vfs может быть полезен в некоторых особых сценариях, поскольку он не использует копирование при записи. Вместо этого каждый уровень получает свой собственный каталог на диске. Когда файлу нужно перемещаться между слоями, он просто копируется в новый каталог.

Следовательно, vfs работает со всеми файловыми системами и выигрывает от простоты и легкости проверки. Он страдает от интенсивного ввода-вывода и склонности к высокой загрузке диска, поскольку каждое изменение файла запускает полную копию с исходного уровня.

devicemapper

Когда-то это был рекомендованный драйвер для CentOS и RHEL, но в более поздних выпусках ядра он уступил место overlay2. Для этого драйвера требовалась файловая система с прямой поддержкой lvm. devicemapper больше не следует использовать — он устарел и будет полностью удален в будущем.

Резюме

Драйверы хранилища Docker используются для управления слоями изображений и доступной для записи частью файловой системы контейнера. Хотя изменения файловых систем контейнера теряются при остановке контейнера, они все равно должны сохраняться во время работы контейнера. Этот механизм обеспечивает драйвер хранилища.

Каждый драйвер обладает различным набором оптимизаций, что делает его более или менее подходящим для разных сценариев. В настоящее время overlay2 является драйвером по умолчанию и рекомендуемым вариантом для большинства рабочих нагрузок, хотя альтернативные варианты, такие как btrfs, zfs и fuse-overlayfs, имеют некоторые более продвинутые функции и могут потребоваться в определенных случаях.

Похожие записи

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *