Образ контейнера (container image) — неизменяемый (immutable) слоистый снимок файловой системы, содержащий приложение и все его зависимости. При запуске образа создаётся контейнер — работающий экземпляр с изолированным процессом и добавленным сверху тонким записываемым слоем. Один образ может порождать сотни одновременно работающих контейнеров.
Слоистая структура
Образ состоит из слоёв (layers). Каждая инструкция в Dockerfile создаёт новый слой. Слои неизменны и кэшируются — если базовый образ уже скачан, загружаются только новые слои. Слои хранятся по содержимому (content-addressable): каждый идентифицируется SHA256-хэшем.
Пример: образ nginx:1.25.3 состоит из нескольких слоёв поверх debian:12 — каждый добавляет файлы. Образ python:3.12-slim поверх debian:12-slim — Python runtime + pip. Ваше приложение добавляет ещё 2–3 слоя с зависимостями и кодом.
История
Docker представил образы контейнеров в 2013 году, базируясь на технологиях UnionFS и LXC. В 2015 году Docker и корпорации основали OCI (Open Container Initiative), стандартизировав формат образов. OCI Image Specification 1.0 опубликована в 2017 году. Containerd (2016, Cloud Native Computing Foundation) стал стандартным runtime для Kubernetes вместо Docker в 2020 году.
Реестры образов
- Docker Hub — крупнейший публичный реестр, >8 млн образов.
- GitHub Container Registry (ghcr.io) — интеграция с GitHub CI/CD.
- Yandex Container Registry — российское облако.
- AWS ECR, Google GCR, Azure ACR — приватные реестры облачных провайдеров.
Связь с хостингом
На VPS образы скачиваются командой docker pull nginx:1.25 и запускаются через docker run или Docker Compose. Для production рекомендуются фиксированные теги версий (nginx:1.25.3) вместо latest — это обеспечивает воспроизводимость деплоя.
Слоистая архитектура образа
Образ — стек read-only слоёв (overlay filesystem). Каждая инструкция Dockerfile создаёт слой. Общие слои разделяются между образами. При запуске — writable слой поверх. docker history image:tag — слои и их размеры. docker inspect — метаданные образа.
Реестры образов
Docker Hub — публичный реестр (hub.docker.com). GitHub Container Registry (ghcr.io). GitLab Container Registry. AWS ECR, GCR, Yandex Container Registry — облачные. Для продакшен-образов рекомендуется частный реестр: исключает зависимость от внешних сервисов.
Безопасность образов
Сканирование уязвимостей: Trivy, Snyk, Docker Scout. Используйте хэши вместо тегов в production: image@sha256:abc123. Подпись образов через Cosign (Sigstore). Принцип минимума: только необходимые пакеты. Секреты — через переменные окружения или Volume, не в образе.
Multi-arch образы
Docker buildx для cross-platform сборки: docker buildx build --platform linux/amd64,linux/arm64 -t myapp:latest .. Manifest list: один тег для нескольких архитектур. На ARM64 (AWS Graviton, Apple Silicon): нативные образы быстрее x86-эмуляции. GitHub Actions: matrix build для нескольких платформ.
Оптимизация размера образа
Анализ: docker history image — слои. dive — интерактивный анализатор слоёв. Уменьшение: объединить RUN команды с &&, удалять cache в том же слое (apt-get clean). Alpine-base: 5 МБ vs Debian 125 МБ. scratch: нулевой base для статических бинарей (Go, Rust).
Образы контейнеров запускаются в Docker и Podman. Kubernetes использует образы из CI/CD. Dockerfile определяет содержимое образа. Bridge network обеспечивает связь между контейнерами. LXC использует системные образы, а не application images.