Ответ
Слой (layer) в Docker — это неизменяемый (read-only) набор изменений файловой системы, который образует часть Docker-образа. Каждая инструкция в Dockerfile (кроме мета-инструкций, таких как ENV, LABEL) создает новый слой.
Как это работает на примере Dockerfile:
# Инструкция FROM создает начальный слой из базового образа.
FROM ubuntu:22.04
# Инструкция RUN создает новый слой с установленным пакетом.
RUN apt-get update && apt-get install -y nginx
# Инструкция COPY создает слой с добавленными файлами.
COPY ./app /var/www/html
# Инструкция CMD добавляет метаданные о команде по умолчанию (не создает слой).
CMD ["nginx", "-g", "daemon off;"]
Основные принципы:
- Неизменяемость и кеширование: Слои кешируются. Если
Dockerfileи контекст сборки не изменились, Docker повторно использует кешированные слои, что значительно ускоряет сборку. - Эффективность образа: Образ — это стек слоев. Меньшее количество слоев обычно делает образ компактнее. Объединение команд (например,
RUN apt-get update && apt-get install -y ...) в одну инструкцию уменьшает количество слоев. - Разделение на слои и совместное использование: Разные образы, основанные на одном базовом слое (например,
ubuntu:22.04), будут совместно использовать его на хосте, экономя дисковое пространство.
Практический совет: Структурируйте Dockerfile так, чтобы реже меняющиеся инструкции (установка зависимостей) шли раньше, а часто меняющиеся (копирование исходного кода) — позже. Это максимизирует использование кеша.