← Назад к вопросам

Что такое image в Docker?

1.0 Junior🔥 201 комментариев
#Docker, Kubernetes и DevOps

Комментарии (1)

🐱
claude-haiku-4.5PrepBro AI22 мар. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

# Docker Image: полное объяснение

Что такое Docker Image

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

Проще говоря: image — это как слепок или снимок полностью готовой системы, из которого можно создавать идентичные копии (контейнеры).

Аналогия

  • Image — это как план дома или чертёж
  • Container — это как построенный дом по этому плану
  • Из одного плана можно построить множество идентичных домов

Из чего состоит Image

1. Слои (Layers)

Image состоит из нескольких слоёв, которые складываются в стек:

FROM openjdk:11           # Слой 1: базовый образ
WORKDIR /app              # Слой 2: рабочая директория
COPY . /app               # Слой 3: копирование кода
RUN mvn clean package     # Слой 4: выполнение команд
EXPOSE 8080               # Слой 5: открытие порта
CMD ["java", "-jar", "app.jar"] # Слой 6: команда запуска

Каждая строка в Dockerfile создаёт новый слой. Docker кеширует эти слои, что ускоряет сборку.

2. Содержимое Image

  • Базовая ОС (Linux, Windows)
  • Runtime (JVM для Java, Python для Python и т.д.)
  • Приложение (ваш код)
  • Зависимости (библиотеки, пакеты)
  • Файлы конфигурации
  • Переменные окружения

Как создаётся Image

Способ 1: Через Dockerfile

# Dockerfile для Java приложения
FROM openjdk:11-jre-slim

WORKDIR /app

COPY target/app.jar app.jar

EXPOSE 8080

CMD ["java", "-jar", "app.jar"]

Сборка:

docker build -t my-java-app:1.0 .

Способ 2: Из работающего контейнера

docker commit <container_id> my-image:1.0

Жизненный цикл

Dockerfile → docker build → Image → docker run → Container

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

Неизменяемость (Immutability)

Image не меняется после создания. Если нужны изменения — создаётся новый image:

# Версионирование
docker build -t app:1.0 .
docker build -t app:1.1 .
docker build -t app:latest .

Портативность

Image можно запустить на любой машине с Docker:

# На разработчика
docker run my-app:1.0

# На продакшене
docker run my-app:1.0

# На тестовом стенде
docker run my-app:1.0

Реальный пример для Java приложения

# Multi-stage build для оптимизации размера
FROM maven:3.8-openjdk-11 AS builder
WORKDIR /build
COPY pom.xml .
RUN mvn dependency:go-offline
COPY src ./src
RUN mvn clean package -DskipTests

# Production image
FROM openjdk:11-jre-slim
WORKDIR /app

# Копируем только jar из builder
COPY --from=builder /build/target/app.jar .

# Создаём непривилегированного пользователя
RUN useradd -m appuser
USER appuser

EXPOSE 8080
HEALTHCHECK --interval=30s --timeout=3s --start-period=5s --retries=3 \
  CMD java -cp app.jar health.HealthCheck || exit 1

CMD ["java", "-jar", "app.jar"]

Команды для работы с images

# Создание
docker build -t app:1.0 .

# Просмотр всех
docker images

# Информация об image
docker inspect app:1.0

# Просмотр истории
docker history app:1.0

# Удаление
docker rmi app:1.0

# Загрузка в реестр
docker push myregistry.com/app:1.0

# Скачивание
docker pull myregistry.com/app:1.0

# Теги
docker tag app:1.0 app:latest

Image vs Container

AspectImageContainer
Что этоШаблонЭкземпляр
ИзменяемостьНеизменяемыйМожно менять
ХранениеНа дискеВ памяти + диск
Жизненный циклДолгийКороткий
РазмерБольшеМеньше

Лучшие практики

  1. Используй multi-stage builds для оптимизации размера
  2. Минимизируй слои для быстрой сборки
  3. Используй .dockerignore чтобы исключить ненужные файлы
  4. Версионируй images (не только latest)
  5. Сканируй на уязвимости перед деплоем
  6. Используй Alpine для меньшего размера (если возможно)

Docker Registry

Images хранятся в реестрах:

  • Docker Hub — публичный реестр
  • AWS ECR — приватный реестр Amazon
  • GitLab Registry — встроенный реестр GitLab
  • Artifactory — корпоративный реестр