Модель дистрибуции (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) артефакты.
Компоненты хранилища:
- Repository (Репозиторий): Коллекция связанных образов, обычно с одним именем (например,
library/nginxилиmy-company/backend). - Tag (Тег): Человекочитаемый указатель на конкретную версию образа (
latest,1.21,stable). Тег — это мутабельная ссылка. Сегодняv1может указывать на один образ, завтра — на другой (после пересборки). - Manifest (Манифест): JSON-файл, описывающий состав образа. Он содержит ссылки на слои (Layers) и конфигурацию образа.
- Blob (Binary Large Object): Сами данные. Слои файловой системы (tar.gz) и JSON-конфиги хранятся как блобы, адресуемые по их контент-хешу (SHA256).
Процесс Pull и Push
Когда вы выполняете docker pull nginx:latest, происходит сложный процесс согласования:
- Resolve Tag: Клиент запрашивает у Registry манифест по тегу
latest. - Get Manifest: Registry отдает JSON-манифест.
- Check Layers: Клиент парсит манифест и получает список SHA256-хешей всех слоев. Он проверяет локальный кэш: “Есть ли у меня уже слой
a1b2...?“. - 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”). Это “индексный” манифест, который не содержит ссылок на слои, а содержит ссылки на другие манифесты под конкретные архитектуры.
- Клиент: “Дай мне
node:latest”. - Registry: “Вот список вариантов (Manifest List): есть для
linux/amd64, есть дляlinux/arm64”. - Клиент: “Я работаю на ARM64, дай мне манифест для этой архитектуры”.
- 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 для бесплатных аккаунтов |