Что такое слои (layers) в Docker-образе?

«Что такое слои (layers) в Docker-образе?» — вопрос из категории DevOps, который задают на 24% собеседований PHP Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Слой (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 так, чтобы реже меняющиеся инструкции (установка зависимостей) шли раньше, а часто меняющиеся (копирование исходного кода) — позже. Это максимизирует использование кеша.