Поиск по сайту:

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


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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

{
    "storage-driver": "overlay2"
}

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

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

оверлей2

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

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

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

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

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

бтрфс и зфс

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

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

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

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

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

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

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

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

ВФС

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

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

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

устройство отображения

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

Краткое содержание

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

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