Ответ
Файловая система 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
).