Что такое Image Layer в Docker?

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

Ответ

Image Layer (слой образа) — это неизменяемый слой файловой системы, который является частью Docker-образа. Каждая инструкция в Dockerfile (например, FROM, RUN, COPY) создает новый слой.

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

# Каждая строка создает новый слой
FROM alpine:latest              # Слой 1: базовый образ ОС
RUN apk add --no-cache curl     # Слой 2: установленный пакет curl
COPY ./app /opt/app             # Слой 3: скопированные файлы приложения
CMD ["/opt/app/start.sh"]      # Слой 4: метаданные (команда по умолчанию)

Ключевые особенности и преимущества:

  • Кэширование слоев: Docker кэширует каждый слой. Если Dockerfile и контекст сборки не изменились, повторная сборка использует кэш, что значительно ускоряет процесс.
  • Экономия дискового пространства: Разные образы могут совместно использовать одни и те же базовые слои (например, alpine:latest).
  • Неизменяемость: После создания слой нельзя изменить. Обновление образа создает новые слои поверх старых.
  • Эффективное дельтовое обновление: При пуше/пулле образа передаются только новые или измененные слои.

Практика оптимизации:

  1. Объединяйте команды RUN для уменьшения количества слоев и удаления временных файлов в одном слое:

    # Плохо: создает два слоя, оставляет кэш apk
    RUN apk update
    RUN apk add curl
    
    # Хорошо: один слой, кэш очищен
    RUN apk update && apk add --no-cache curl && rm -rf /var/cache/apk/*
  2. Используйте .dockerignore, чтобы не копировать в контекст сборки ненужные файлы (например, node_modules, .git), что предотвращает создание излишне больших слоев.
  3. Многоступенчатая сборка (multi-stage build) позволяет копировать только артефакты (бинарники, jar-файлы) из промежуточных образов в финальный, исключая ненужные слои с инструментами сборки.