Из чего состоит образ в Docker?

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

Ответ

Образ Docker — это многослойный, неизменяемый шаблон, содержащий все зависимости и конфигурацию для запуска приложения. Его структура определяется инструкциями в Dockerfile.

Основные компоненты образа:

  1. Базовый образ (Base Image): Первый слой, обычно минимальная ОС (например, alpine, ubuntu) или среда выполнения (например, node:18, python:3.11-slim).
  2. Слои зависимостей: Каждая инструкция RUN, COPY, ADD создает новый слой.
    • RUN apt-get update && apt-get install -y nginx добавляет слой с установленными пакетами.
    • COPY ./app /app добавляет слой с кодом приложения.
  3. Метаданные и конфигурация: Инструкции, которые не создают слои файловой системы, но определяют поведение контейнера:
    • ENV — переменные окружения.
    • EXPOSE — объявляет порты.
    • WORKDIR — рабочая директория.
    • USER — пользователь для запуска процессов.
    • CMD или ENTRYPOINT — команда по умолчанию для запуска.

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

FROM alpine:3.18
RUN apk add --no-cache python3 py3-pip
COPY requirements.txt .
RUN pip install -r requirements.txt
COPY . /app
WORKDIR /app
ENV NODE_ENV=production
EXPOSE 8000
CMD ["python3", "app.py"]

Ключевое преимущество слоев — кэширование. Docker кэширует каждый слой. При повторной сборке, если инструкция и ее контекст не изменились, Docker использует кэшированный слой, что значительно ускоряет процесс.