Что такое Docker image и как он устроен?

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

Ответ

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

Ключевые характеристики:

  1. Иммутабельность — образ нельзя изменить после сборки. Любые изменения требуют создания нового образа.
  2. Слоистая структура — каждый шаг в Dockerfile создаёт новый слой. Слои кэшируются и переиспользуются, что ускоряет сборку.
  3. Хранение в реестрах — образы хранятся в реестрах (Docker Hub, AWS ECR, Google Container Registry).

Пример Dockerfile:

# Базовый образ (первый слой)
FROM openjdk:17-jdk-slim

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

# Копирование файлов (третий слой)
COPY target/myapp.jar ./app.jar

# Открытие порта (метаданные, не создаёт слой)
EXPOSE 8080

# Команда запуска (четвёртый слой)
CMD ["java", "-jar", "app.jar"]

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

# Сборка образа из Dockerfile
docker build -t myapp:1.0 .

# Просмотр локальных образов
docker images

# Загрузка образа в реестр
docker push myapp:1.0

# Скачивание образа из реестра
docker pull myapp:1.0

# Удаление локального образа
docker rmi myapp:1.0

Почему слои важны:

  • При изменении одного шага в Dockerfile пересобираются только последующие слои
  • Разные образы могут делиться общими базовыми слоями, экономя дисковое пространство
  • Слоистая структура обеспечивает эффективную дельту при передаче образов