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

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

Ответ

Слой в Docker-образе — это неизменяемый (read-only) файловый снимок (snapshot), который представляет собой результат выполнения одной инструкции в Dockerfile. Образ формируется как стек таких слоёв.

Как это работает:

  1. Каждая команда в Dockerfile (FROM, RUN, COPY, ADD, ENV и др.) создаёт новый слой поверх предыдущих.
  2. Слои кешируются. Если Dockerfile и контекст сборки не изменились, Docker повторно использует кешированные слои, что значительно ускоряет сборку.
  3. Разные образы могут совместно использовать одни и те же базовые слои (например, alpine:latest), что экономит место на диске.
  4. Контейнер запускается с добавлением тонкого записываемого слоя (container layer) поверх стека слоёв образа.

Пример Dockerfile и соответствующих слоёв:

# Слой 1: Базовый образ (например, alpine:latest)
FROM alpine:latest
# Слой 2: Установка пакетов
RUN apk add --no-cache python3 py3-pip
# Слой 3: Копирование файлов приложения
COPY app.py requirements.txt /app/
# Слой 4: Установка зависимостей Python
RUN pip3 install -r /app/requirements.txt
# Слой 5: Определение команды запуска
CMD ["python3", "/app/app.py"]

Просмотр истории образа:

docker image history <имя_образа>

Практические следствия и best practices:

  • Оптимизация размера: Объединяйте связанные команды RUN с помощью && и обратной косой черты, чтобы минимизировать количество слоёв и удалять временные файлы в одном слое.
    # Плохо: 2 слоя
    RUN apt-get update
    RUN apt-get install -y package
    # Хорошо: 1 слой, кеш очищен
    RUN apt-get update && apt-get install -y package && rm -rf /var/lib/apt/lists/*
  • Порядок инструкций: Меняющиеся реже инструкции (например, COPY зависимостей) стоит размещать выше, чтобы использовать кеш для слоёв с установкой.
  • Многоступенчатая сборка (multi-stage): Позволяет использовать промежуточные образы для компиляции, а в итоговый образ копировать только необходимые артефакты, исключая инструменты сборки и промежуточные слои.