Как устроена файловая система в Docker?

Ответ

Файловая система Docker основана на концепции Union File System (UFS), которая позволяет объединять несколько файловых систем (слоёв) в одну.

Каждый образ Docker состоит из набора слоёв, доступных только для чтения. При запуске контейнера поверх этих слоёв добавляется один записываемый слой.

Ключевые принципы:

  • Слои только для чтения (Read-only layers): Основа любого образа. Каждый слой представляет собой набор изменений (например, RUN apt-get install) и является неизменяемым. Это обеспечивает переиспользование слоёв между разными образами и экономит место.
  • Записываемый слой (Writable layer): Создаётся для каждого контейнера. Все изменения, такие как создание, изменение или удаление файлов, происходят именно в этом слое.
  • Механизм Copy-on-Write (CoW): Если контейнеру нужно изменить файл из нижележащего read-only слоя, Docker копирует этот файл в записываемый слой и вносит изменения уже там. Оригинальный файл в слое образа остаётся нетронутым.

Пример слоёв в Dockerfile:

# 1. Базовый слой из образа python
FROM python:3.9-slim

# 2. Слой с установкой зависимостей
RUN pip install flask

# 3. Слой с копированием кода приложения
COPY ./app /app

# При запуске контейнера будет добавлен 4-й, записываемый слой
CMD ["python", "/app/main.py"]

Эта архитектура делает образы легковесными и ускоряет развёртывание контейнеров. Реализация UFS зависит от storage driver (например, overlay2, aufs).