Что такое OverlayFS и как она используется в Docker?

«Что такое OverlayFS и как она используется в Docker?» — вопрос из категории Docker, который задают на 24% собеседований Devops Инженер. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

OverlayFS — это современная объединяющая файловая система (union filesystem), которая является стандартным драйвером хранения (storage driver) в Docker. Она позволяет эффективно объединять несколько директорий (слоёв) в единое представление, что лежит в основе работы Docker-образов и контейнеров.

Архитектура слоёв в Docker:

  1. lowerdir (нижние, read-only слои): Базовый образ (например, ubuntu:latest) и все слои из Dockerfile (RUN, COPY и т.д.). Эти слои общие для всех контейнеров, основанных на одном образе.
  2. upperdir (верхний, read-write слой): Уникальный для каждого контейнера слой, куда записываются все изменения (создание, модификация, удаление файлов) во время его жизни.
  3. merged: Единое виртуальное представление файловой системы контейнера, которое видит запущенный процесс.

Практический пример: При запуске контейнера docker run -it ubuntu bash Docker монтирует OverlayFS. Если внутри контейнера изменить файл из нижнего слоя, OverlayFS реализует механизм copy-on-write (CoW): файл копируется в upperdir, и изменения применяются уже к этой копии.

Проверка и отладка:

# Узнать, какой storage driver используется
docker info | grep "Storage Driver"
# Просмотреть информацию о слоях конкретного контейнера
docker inspect <container_id> --format='{{.GraphDriver.Data}}'

Преимущества для DevOps:

  • Экономия дискового пространства: Общие слои не дублируются.
  • Быстрый запуск контейнеров: Не нужно копировать весь образ.
  • Эффективное использование кэша сборки: Изменение в одном слое Dockerfile не требует пересборки предыдущих.

Ограничения и нюансы:

  • Работа с OverlayFS требует поддержки ядром (CONFIG_OVERLAY_FS).
  • Производительность операций, интенсивно использующих CoW (например, частые записи в большие файлы), может быть ниже, чем у нативных ФС. Для таких сценариев используют volumes.