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

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

2.2 Middle🔥 121 комментариев
#DevOps и инфраструктура

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

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

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

Docker Image

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

Основные концепции

Image — это:

  • Слои (layers) — стопка прочитанных файловых систем, где каждый слой — результат одной команды в Dockerfile
  • Неизменяемый — один раз собранный образ не меняется
  • Переносимый — работает одинаково на любой машине с Docker
  • Версионируемый — можно отслеживать версии через теги

Структура Docker Image

Image (read-only)
├── Layer 1 (базовая ОС, например Ubuntu)
├── Layer 2 (установка Python)
├── Layer 3 (копирование зависимостей)
├── Layer 4 (установка pip пакетов)
├── Layer 5 (копирование кода приложения)
└── Layer N (команда при старте контейнера)

Создание Image: Dockerfile

# Dockerfile
FROM python:3.11-slim  # Слой 1: базовый образ

WORKDIR /app           # Слой 2: рабочая директория

COPY requirements.txt . # Слой 3: копируем зависимости

RUN pip install -r requirements.txt  # Слой 4: устанавливаем пакеты

COPY . .               # Слой 5: копируем весь код

EXPOSE 5000            # Объявляем порт

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

Сборка Image

# Собрать image с тегом
docker build -t my-app:1.0 .

# Собрать с несколькими тегами
docker build -t my-app:1.0 -t my-app:latest .

# Собрать с переменными окружения
docker build --build-arg VERSION=1.0 -t my-app:1.0 .

Работа с Images через Python

import docker

client = docker.from_env()

# Список всех images
images = client.images.list()
for image in images:
    print(f"Tags: {image.tags}")
    print(f"Size: {image.attrs['Size']} bytes")

# Построить image
image, build_logs = client.images.build(
    path=".",
    tag="my-app:1.0",
    dockerfile="Dockerfile"
)
for log in build_logs:
    print(log)

# Получить image по имени
image = client.images.get("my-app:1.0")
print(image.attrs['RepoTags'])

# Удалить image
client.images.remove("my-app:1.0", force=True)

# Тэгировать image
image.tag("my-app", "2.0")

# Отправить на Docker Hub
for line in client.images.push("my-app:1.0", stream=True, decode=True):
    print(line)

CLI команды

# Список всех images
docker images

# Детальная информация об image
docker inspect my-app:1.0

# История слоёв image
docker history my-app:1.0

# Удалить image
docker rmi my-app:1.0

# Удалить все неиспользуемые images
docker image prune

# Скачать image с Docker Hub
docker pull python:3.11

# Загрузить image на Docker Hub
docker push username/my-app:1.0

# Переименовать (тэгировать) image
docker tag my-app:1.0 username/my-app:1.0

Слои (Layers) и кэширование

FROM python:3.11-slim  # Слой 1
RUN apt-get update && apt-get install -y curl  # Слой 2
COPY requirements.txt .  # Слой 3
RUN pip install -r requirements.txt  # Слой 4
COPY . .  # Слой 5

При пересборке, Docker использует кэш слоёв:

  • Если requirements.txt не изменился, Слой 4 используется из кэша
  • Если requirements.txt изменился, перестраиваются Слои 4 и 5
  • Это ускоряет rebuild

Оптимизация размера Image

# ❌ Плохо: большой image (1GB+)
FROM ubuntu:22.04
RUN apt-get update
RUN apt-get install -y python3 pip curl git ...
RUN pip install package1 package2 ...
COPY . .

# ✅ Хорошо: меньше слоёв, меньше мусора (100-200MB)
FROM python:3.11-slim
RUN pip install --no-cache-dir -r requirements.txt
COPY . .

Multi-stage builds

# Stage 1: build
FROM python:3.11 AS builder
COPY requirements.txt .
RUN pip install --user -r requirements.txt

# Stage 2: runtime
FROM python:3.11-slim
COPY --from=builder /root/.local /root/.local
COPY . .
CMD ["python", "app.py"]

Второй stage копирует только необходимые файлы, уменьшая финальный image.

Регистры (Registries)

# Docker Hub (по умолчанию)
docker push my-app:1.0  # В Docker Hub

# Private registry
docker tag my-app:1.0 private-registry.com/my-app:1.0
docker push private-registry.com/my-app:1.0

# AWS ECR
aws ecr get-login-password | docker login --username AWS --password-stdin <account>.dkr.ecr.<region>.amazonaws.com
docker tag my-app:1.0 <account>.dkr.ecr.<region>.amazonaws.com/my-app:1.0
docker push <account>.dkr.ecr.<region>.amazonaws.com/my-app:1.0

Образы для Python разработчика

# Очень минимальный
alpine  # ~5MB

# Компактный
python:3.11-slim  # ~120MB

# Стандартный
python:3.11  # ~900MB

# С дополнительными инструментами
python:3.11-bullseye  # ~900MB

Вывод: Docker Image — это готовый пакет приложения, который можно скопировать, версионировать и запустить на любой машине с одинаковым результатом. Это основа containerization и микросервисной архитектуры.