Что такое концепция слоев в Docker?

«Что такое концепция слоев в Docker?» — вопрос из категории DevOps, который задают на 25% собеседований C/C++ Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Слои (layers) в Docker — это неизменяемые файловые снимки, из которых собирается Docker-образ. Каждая инструкция в Dockerfile создает новый слой поверх предыдущих.

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

  1. Базовый слой: Обычно минимальная ОС (например, alpine:latest).
  2. Слои команд: Каждая команда (RUN, COPY, ADD) создает новый слой с изменениями файловой системы.
  3. Контейнерный слой: При запуске контейнера поверх образа добавляется тонкий слой для записи (copy-on-write).

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

# Слой 1: Базовый образ
FROM ubuntu:22.04

# Слой 2: Результат выполнения apt-get update && apt-get install
RUN apt-get update && apt-get install -y g++

# Слой 3: Добавление исходного кода
COPY ./src /app/src

# Слой 4: Компиляция
RUN g++ /app/src/main.cpp -o /app/hello

# Слой 5: Команда по умолчанию
CMD ["/app/hello"]

Преимущества слоев:

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

Практический совет: Объединяйте команды RUN в одну цепочку через &&, чтобы уменьшить количество слоев и избежать накопления промежуточных данных в кэше.