Ответ
Слои (layers) — это фундаментальная концепция Docker, лежащая в основе сборки и хранения образов. Каждая инструкция в Dockerfile (например, FROM, RUN, COPY) создает новый, неизменяемый (immutable) слой поверх предыдущего.
Такая архитектура обеспечивает высокую эффективность за счет:
- Кеширования: Если инструкция и ее контекст (например, файлы для
COPY) не изменились, Docker переиспользует существующий слой из кеша, что значительно ускоряет повторные сборки. - Экономии места: Разные образы могут использовать общие базовые слои (например,
ubuntu:20.04), избегая дублирования данных на диске.
Механизм Copy-on-Write (CoW):
При запуске контейнера поверх слоев образа добавляется тонкий записываемый слой (writable layer). Все изменения, происходящие в контейнере (создание, изменение, удаление файлов), записываются только в этот слой. Исходные слои образа при этом остаются неизменными.
Пример Dockerfile и его слои:
# 1. Базовый слой с ОС и Python
FROM python:3.9-slim
# 2. Слой с рабочей директорией
WORKDIR /app
# 3. Слой с зависимостями (кешируется, если requirements.txt не менялся)
COPY requirements.txt .
RUN pip install --no-cache-dir -r requirements.txt
# 4. Слой с кодом приложения (меняется часто)
COPY . .
CMD ["python", "main.py"]
Best Practices:
- Порядок инструкций: Располагайте инструкции, которые меняются редко (установка зависимостей), как можно выше в
Dockerfileдля максимального использования кеша. -
Минимизация слоев: Объединяйте связанные команды
RUNс помощью&&, чтобы уменьшить количество слоев и итоговый размер образа.# Плохо: 3 слоя RUN apt-get update RUN apt-get install -y curl RUN rm -rf /var/lib/apt/lists/* # Хорошо: 1 слой RUN apt-get update && apt-get install -y curl && rm -rf /var/lib/apt/lists/*