# Container registry

> Сервер, который хранит и раздаёт образы контейнеров по протоколу OCI Distribution; примеры — Docker Hub, GitHub Container Registry, Harbor.

Источник: https://llmdocs.ru/wiki/container-registry/ · обновлено 2026-11-09 · лицензия CC BY-SA 4.0

- **Стандарт**: 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** (реестр контейнеров) — сервер, на котором хранятся [образы контейнеров](https://llmdocs.ru/wiki/oci-image.md) и с которого их скачивают. Команда `docker push` отправляет собранный образ в реестр, а `docker pull` — или [Kubernetes](https://llmdocs.ru/wiki/kubernetes.md) при запуске пода — забирает его оттуда. Реестр — связующее звено между сборкой в [CI/CD](https://llmdocs.ru/wiki/ci-cd.md) и запуском в продакшене: 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` сегодня и завтра могут указывать на разные образы. **Дайджест** неизменен, поэтому для воспроизводимых развёртываний образы фиксируют по нему или используют неизменяемые теги с [версией](https://llmdocs.ru/wiki/semver.md) и хешем коммита.

## Популярные реестры

| Реестр | Особенности |
|---|---|
| **Docker Hub** | реестр по умолчанию, официальные образы; ограничения частоты скачивания для анонимных и бесплатных пользователей[3] |
| **GitHub Container Registry** (`ghcr.io`) | привязан к репозиториям и [GitHub Actions](https://llmdocs.ru/wiki/github-actions.md), бесплатен для публичных образов[4] |
| **Quay.io** | реестр Red Hat со сканированием уязвимостей |
| **Amazon ECR, Google Artifact Registry, Azure ACR** | интеграция с IAM и кластерами своего облака |
| **GitLab Container Registry** | встроен в [GitLab](https://llmdocs.ru/wiki/gitlab.md) и GitLab CI |
| **Harbor** | open source, проект CNCF: проекты, RBAC, сканирование, репликация, прокси-кэш[5] |
| **Distribution (`registry:2`)**, **Zot** | минимальные самостоятельные реестры |

## Работа с реестром

```bash
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](https://llmdocs.ru/wiki/configmap-secret.md)).

## Безопасность

- **Сканирование уязвимостей** — Trivy, Grype или встроенные сканеры Harbor, ECR и Quay проверяют пакеты в слоях по базам CVE.
- **Подпись образов** — `cosign` из проекта Sigstore подписывает образ по дайджесту; подпись хранится в том же реестре, а политика в кластере (Kyverno, policy-controller) не пускает неподписанные образы.[6]
- **SBOM и аттестации** — список компонентов и сведения о сборке прикладываются к образу как OCI-артефакты.
- **Секреты** — пароли и ключи не должны попадать в слои образа: даже удалённый в следующем слое файл остаётся в истории (решение — [многоэтапная сборка](https://llmdocs.ru/wiki/multi-stage-build.md) и секреты BuildKit).

## Эксплуатация

Реестр быстро растёт: каждый пуш оставляет слои. Нужны **политики хранения** (удалять теги старше N дней, оставлять последние M версий) и сборка мусора для неиспользуемых блобов. **Прокси-кэш** (pull-through cache) перед Docker Hub снижает зависимость от внешнего сервиса и его лимитов. Помимо образов, реестры OCI сегодня хранят Helm-чарты (`helm push oci://...`), WebAssembly-модули и даже веса моделей машинного обучения.

## См. также

- [Образ контейнера и OCI](https://llmdocs.ru/wiki/oci-image.md)
- [Docker](https://llmdocs.ru/wiki/docker.md)
- [Dockerfile](https://llmdocs.ru/wiki/dockerfile.md)
- [GitHub Actions](https://llmdocs.ru/wiki/github-actions.md)

## Источники

1. [OCI Distribution Specification](https://github.com/opencontainers/distribution-spec/blob/main/spec.md)
2. [Docker Docs — Docker Hub](https://docs.docker.com/docker-hub/)
3. [Docker Docs — Usage and rate limits](https://docs.docker.com/docker-hub/usage/)
4. [GitHub Docs — Working with the Container registry](https://docs.github.com/en/packages/working-with-a-github-packages-registry/working-with-the-container-registry)
5. [Harbor — официальный сайт](https://goharbor.io/)
6. [Sigstore — cosign](https://docs.sigstore.dev/cosign/signing/overview/)
