Комментарии (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
| Aspect | Image | Container |
|---|---|---|
| Что это | Шаблон | Экземпляр |
| Изменяемость | Неизменяемый | Можно менять |
| Хранение | На диске | В памяти + диск |
| Жизненный цикл | Долгий | Короткий |
| Размер | Больше | Меньше |
Лучшие практики
- Используй multi-stage builds для оптимизации размера
- Минимизируй слои для быстрой сборки
- Используй .dockerignore чтобы исключить ненужные файлы
- Версионируй images (не только latest)
- Сканируй на уязвимости перед деплоем
- Используй Alpine для меньшего размера (если возможно)
Docker Registry
Images хранятся в реестрах:
- Docker Hub — публичный реестр
- AWS ECR — приватный реестр Amazon
- GitLab Registry — встроенный реестр GitLab
- Artifactory — корпоративный реестр