Container registry
| Стандарт | OCI Distribution Specification (1.0 — 2021) |
|---|---|
| Протокол | HTTP API поверх TLS |
| Адресация образа | реестр/пространство/имя:тег или @sha256:дайджест |
| Публичные | Docker Hub, GHCR, Quay.io, Amazon ECR Public |
| Облачные | Amazon ECR, Google Artifact Registry, Azure ACR, Yandex Container Registry |
| Свои | Harbor, GitLab Container Registry, Distribution (registry:2), Zot |
Container registry (реестр контейнеров) — сервер, на котором хранятся образы контейнеров и с которого их скачивают. Команда docker push отправляет собранный образ в реестр, а docker pull — или Kubernetes при запуске пода — забирает его оттуда. Реестр — связующее звено между сборкой в CI/CD и запуском в продакшене: CI публикует образ с версией, а кластер разворачивает именно её.
Как устроен
Реестр реализует HTTP API, стандартизированный как OCI Distribution Specification (на основе Docker Registry HTTP API V2).[1] Образ хранится не как один файл, а как набор объектов, адресуемых по хешу SHA-256 (content-addressable storage):
- блобы — слои файловой системы (tar.gz) и конфигурация;
- манифест — JSON со списком слоёв и их дайджестов;
- индекс (manifest list) — список манифестов для разных архитектур (
linux/amd64,linux/arm64).
Одинаковые слои хранятся один раз и не скачиваются повторно, если уже есть на машине. Основные операции API: GET /v2/<имя>/manifests/<ссылка>, GET /v2/<имя>/blobs/<дайджест>, загрузка блобов через POST/PUT.
Имена образов
Полное имя образа:
ghcr.io/acme/api:1.4.2
└─реестр─┘└─репозиторий─┘└тег┘
ghcr.io/acme/api@sha256:9f86d081884c7d65... # по дайджесту
Если реестр не указан, Docker подставляет docker.io, а для официальных образов — ещё и library/ (nginx = docker.io/library/nginx). Тег — изменяемая метка: latest или 1.4 сегодня и завтра могут указывать на разные образы. Дайджест неизменен, поэтому для воспроизводимых развёртываний образы фиксируют по нему или используют неизменяемые теги с версией и хешем коммита.
Популярные реестры
| Реестр | Особенности |
|---|---|
| Docker Hub | реестр по умолчанию, официальные образы; ограничения частоты скачивания для анонимных и бесплатных пользователей[3] |
GitHub Container Registry (ghcr.io) |
привязан к репозиториям и GitHub Actions, бесплатен для публичных образов[4] |
| Quay.io | реестр Red Hat со сканированием уязвимостей |
| Amazon ECR, Google Artifact Registry, Azure ACR | интеграция с IAM и кластерами своего облака |
| GitLab Container Registry | встроен в GitLab и GitLab CI |
| Harbor | open source, проект CNCF: проекты, RBAC, сканирование, репликация, прокси-кэш[5] |
Distribution (registry:2), Zot |
минимальные самостоятельные реестры |
Работа с реестром
docker login ghcr.io -u USER --password-stdin < token.txt
docker build -t ghcr.io/acme/api:1.4.2 .
docker push ghcr.io/acme/api:1.4.2
# мультиархитектурный образ
docker buildx build --platform linux/amd64,linux/arm64 \
-t ghcr.io/acme/api:1.4.2 --push .
# свой реестр для тестов
docker run -d -p 5000:5000 --name registry registry:2
Утилиты skopeo и crane копируют образы между реестрами и смотрят манифесты без скачивания слоёв. Чтобы Kubernetes скачивал образы из приватного реестра, создают секрет типа docker-registry и указывают его в imagePullSecrets пода (см. ConfigMap и Secret).
Безопасность
- Сканирование уязвимостей — Trivy, Grype или встроенные сканеры Harbor, ECR и Quay проверяют пакеты в слоях по базам CVE.
- Подпись образов —
cosignиз проекта Sigstore подписывает образ по дайджесту; подпись хранится в том же реестре, а политика в кластере (Kyverno, policy-controller) не пускает неподписанные образы.[6] - SBOM и аттестации — список компонентов и сведения о сборке прикладываются к образу как OCI-артефакты.
- Секреты — пароли и ключи не должны попадать в слои образа: даже удалённый в следующем слое файл остаётся в истории (решение — многоэтапная сборка и секреты BuildKit).
Эксплуатация
Реестр быстро растёт: каждый пуш оставляет слои. Нужны политики хранения (удалять теги старше N дней, оставлять последние M версий) и сборка мусора для неиспользуемых блобов. Прокси-кэш (pull-through cache) перед Docker Hub снижает зависимость от внешнего сервиса и его лимитов. Помимо образов, реестры OCI сегодня хранят Helm-чарты (helm push oci://...), WebAssembly-модули и даже веса моделей машинного обучения.