Почему Docker похож на лук?

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

Ответ

Аналогия с луком используется, потому что образ Docker состоит из слоёв, каждый из которых представляет собой неизменяемый набор изменений файловой системы. Каждая инструкция в Dockerfile (например, FROM, RUN, COPY) создаёт новый слой поверх предыдущего.

Ключевые моменты:

  • Кэширование слоёв: Слои кэшируются. Если инструкция и её контекст не изменились, Docker использует кэшированный слой, что значительно ускоряет повторные сборки.
  • Эффективность хранения: Слои совместно используются разными образами (например, если несколько образов основаны на alpine:latest), что экономит место на диске.
  • Итоговый образ: Это объединение всех слоёв в единую виртуальную файловую систему (Union File System).

Пример Dockerfile и его слои:

# Слой 1: Базовый образ
FROM alpine:latest
# Слой 2: Установка пакетов
RUN apk add --no-cache curl && apk add --no-cache git
# Слой 3: Копирование файлов приложения
COPY app.py /app/
# Слой 4: Определение точки входа
CMD ["python", "/app/app.py"]

Оптимизация: Чтобы уменьшить количество слоёв и итоговый размер, часто объединяют связанные команды RUN в одну с помощью &&.