Для чего нужен Docker image?

«Для чего нужен Docker image?» — вопрос из категории DevOps, который задают на 26% собеседований Data Scientist / ML Инженер. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Docker image (образ) — это неизменяемый шаблон, содержащий всё необходимое для запуска приложения: код, среду выполнения, системные библиотеки, переменные окружения и конфигурационные файлы. Образ — это основа для создания контейнеров.

Основные цели Docker image:

  1. Стандартизация и повторяемость: Образ гарантирует, что приложение будет запускаться идентично в любом месте (на ноутбуке разработчика, CI-сервере, продакшн-хосте), устраняя проблему "у меня работает".
  2. Инкапсуляция зависимостей: Все зависимости (например, конкретная версия Python, системные пакеты, pip-библиотеки) упакованы внутрь образа. Нет необходимости устанавливать что-либо на хост-систему.
  3. Эффективное использование ресурсов: В отличие от полноценной виртуальной машины, контейнеры, созданные из образов, используют ядро хоста, что делает их легковесными и быстрыми в запуске.
  4. Слоистая структура и кэширование: Образ состоит из слоев (read-only). Каждая инструкция в Dockerfile создает новый слой. Это позволяет эффективно кэшировать слои и повторно использовать их между разными образами, ускоряя сборку.

Пример простого Dockerfile для Python-приложения:

# Базовый слой с Python
FROM python:3.11-slim

# Установка рабочей директории внутри контейнера
WORKDIR /app

# Копирование файла зависимостей и их установка (это отдельный кэшируемый слой)
COPY requirements.txt .
RUN pip install --no-cache-dir -r requirements.txt

# Копирование всего остального кода приложения
COPY . .

# Команда для запуска приложения при старте контейнера
CMD ["python", "app.py"]

Работа с образами:

  • Сборка: docker build -t my-app:latest . — создает образ из Dockerfile.
  • Просмотр: docker images — список локальных образов.
  • Запуск: docker run -p 8000:8000 my-app:latest — создает и запускает контейнер из образа.
  • Публикация: docker push my-registry.com/my-app:latest — отправляет образ в реестр (Docker Hub, GitLab Registry и др.).