Комментарии (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 и микросервисной архитектуры.