Модель дистрибуции (Registry)

TL;DR: Registry хранит образы как слои (blobs) + манифесты (JSON). Тег — мутабельная ссылка, дайджест (SHA256) — иммутабельная. Multi-arch работает через Manifest Lists.

Одной из причин успеха Docker стала стандартизация не только формата упаковки (Image), но и протокола их доставки. Registry (Реестр) — это серверное приложение для хранения и распространения Docker-образов.

Понимание устройства Registry необходимо для настройки CI/CD пайплайнов, оптимизации скорости деплоя и обеспечения безопасности цепочки поставок (Supply Chain Security).

Анатомия Registry

Registry реализует спецификацию OCI Distribution Spec. Это стандартизированный REST API, позволяющий клиентам (Docker CLI, Kubernetes, cURL) загружать (push) и скачивать (pull) артефакты.

Компоненты хранилища:

  1. Repository (Репозиторий): Коллекция связанных образов, обычно с одним именем (например, library/nginx или my-company/backend).
  2. Tag (Тег): Человекочитаемый указатель на конкретную версию образа (latest, 1.21, stable). Тег — это мутабельная ссылка. Сегодня v1 может указывать на один образ, завтра — на другой (после пересборки).
  3. Manifest (Манифест): JSON-файл, описывающий состав образа. Он содержит ссылки на слои (Layers) и конфигурацию образа.
  4. Blob (Binary Large Object): Сами данные. Слои файловой системы (tar.gz) и JSON-конфиги хранятся как блобы, адресуемые по их контент-хешу (SHA256).

Процесс Pull и Push

Когда вы выполняете docker pull nginx:latest, происходит сложный процесс согласования:

  1. Resolve Tag: Клиент запрашивает у Registry манифест по тегу latest.
  2. Get Manifest: Registry отдает JSON-манифест.
  3. Check Layers: Клиент парсит манифест и получает список SHA256-хешей всех слоев. Он проверяет локальный кэш: “Есть ли у меня уже слой a1b2...?“.
  4. Download Blobs: Клиент скачивает только те слои, которых у него нет. Это обеспечивает дедупликацию данных. Если у вас уже есть Ubuntu 22.04, скачивание Node.js (основанного на Ubuntu) займет секунды, так как базовые слои не будут качаться повторно.

Content Addressable Storage (CAS)

Registry работает как CAS-система. Это значит, что если два разных образа (например, python:3.9 и node:16) используют один и тот же базовый слой (например, debian:bullseye), этот слой будет храниться на диске Registry в единственном экземпляре.

Manifest Lists (Multi-arch images)

Как работает магия, когда вы делаете docker pull node на MacBook M1 (ARM64) и на сервере Linux (AMD64), и везде скачивается правильная версия?

За это отвечают Manifest Lists (“Fat Manifests”). Это “индексный” манифест, который не содержит ссылок на слои, а содержит ссылки на другие манифесты под конкретные архитектуры.

  1. Клиент: “Дай мне node:latest”.
  2. Registry: “Вот список вариантов (Manifest List): есть для linux/amd64, есть для linux/arm64”.
  3. Клиент: “Я работаю на ARM64, дай мне манифест для этой архитектуры”.
  4. Registry: Отдает конкретный манифест образа под ARM.

Безопасность и Доверие

Docker Content Trust (DCT)

Поскольку теги мутабельны, есть риск атаки “Man in the Middle” или подмены образа в Registry. DCT использует цифровую подпись (Notary). Разработчик подписывает образ своим приватным ключом. При включенном DCT (export DOCKER_CONTENT_TRUST=1) Docker Engine откажется запускать образ, если его подпись не валидна или отсутствует.

Private Registry

В корпоративной среде использование публичного Docker Hub часто запрещено. Используются приватные реестры (Harbor, Nexus, GitLab Container Registry, AWS ECR). Доступ к ним осуществляется через docker login и создание секрета imagePullSecrets в оркестраторах.

Важно: Registry хранит слои в сжатом виде (gzip). Распаковка происходит на клиенте. Это снижает нагрузку на сеть, но увеличивает нагрузку на CPU при запуске.

Подводные камни

ЗаблуждениеРеальность
«Тег latest = последняя версия»latest — просто имя тега. Его можно не обновлять, привязать к старому образу
«docker pull качает весь образ»Качаются только отсутствующие слои (дедупликация через content-addressable storage)
«Мой образ безопасен»Без сканирования (Trivy, Docker Scout) вы не знаете, какие CVE в базовых слоях
«Private registry не нужен»Docker Hub rate limits: 100 pulls/6h для анонимных, 200 для бесплатных аккаунтов