Ответ
Слой в Docker-образе — это неизменяемый (read-only) файловый снимок (snapshot), который представляет собой результат выполнения одной инструкции в Dockerfile. Образ формируется как стек таких слоёв.
Как это работает:
- Каждая команда в
Dockerfile(FROM,RUN,COPY,ADD,ENVи др.) создаёт новый слой поверх предыдущих. - Слои кешируются. Если
Dockerfileи контекст сборки не изменились, Docker повторно использует кешированные слои, что значительно ускоряет сборку. - Разные образы могут совместно использовать одни и те же базовые слои (например,
alpine:latest), что экономит место на диске. - Контейнер запускается с добавлением тонкого записываемого слоя (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): Позволяет использовать промежуточные образы для компиляции, а в итоговый образ копировать только необходимые артефакты, исключая инструменты сборки и промежуточные слои.