Що таке Docker registry і чим він відрізняється від Docker Hub?
Docker registry це тип; Docker Hub це один інстанс цього типу. Плутанина між ними це одна з найпоширеніших помилок у формулюваннях, коли люди починають працювати з image поза Docker Hub.
Теорія
TL;DR
- Registry = сервер, що зберігає і дистрибутить image за OCI Distribution Spec. Загальний термін.
- Docker Hub = конкретний публічний registry, що хостить Docker Inc на
docker.io. Дефолтний, коли в імені image registry не вказаний. - Той самий протокол, той самий формат image, ті самі команди клієнта. Єдина різниця між registry: хто їх крутить, яка auth потрібна, у якій мережі вони живуть, які ліміти ставлять.
- Прод-команди зазвичай обирають приватний registry близько до своїх навантажень (AWS ECR для сервісів на AWS, GCR для GCP, GHCR для GitHub-центричних команд).
- Self-hosted варіанти (Harbor, open-source
distribution/registry) існують, коли потрібен повний контроль над сховищем, auth і air-gapped операцією.
Швидкий приклад
# Той самий формат image, чотири різних registry:
$ docker pull nginx:1.27 # docker.io неявно
$ docker pull ghcr.io/myorg/api:1.0 # GitHub
$ docker pull 123456789.dkr.ecr.eu-west-1.amazonaws.com/api:1.0 # AWS ECR
$ docker pull harbor.example.com/team/api:1.0 # self-hosted HarborІм'я registry це префікс перед першим /. Без префіксу означає Docker Hub.
Що робить кожен registry
Кожен OCI-сумісний registry реалізує той самий набір HTTP-endpoint'ів (OCI Distribution Spec):
GET /v2/<name>/manifests/<tag-or-digest>, отримати manifest imageGET /v2/<name>/blobs/<digest>, отримати layer або config blobPUT /v2/<name>/manifests/<tag>, запушити manifestPOST /v2/<name>/blobs/uploads/потімPATCH/PUT, запушити blobDELETE /v2/<name>/manifests/<digest>, видалити (де дозволено)
Коли ти робиш docker push myreg.example.com/myapp:1.0, daemon б'є по цих endpoint'ах. Немає «Docker Hub-протоколу», всі говорять однаково.
Docker Hub конкретно
Registry плюс екстра, що приходять від Docker Inc:
- Безкоштовні публічні репо, необмежена кількість.
- Free tier приватні репо зі строгими лімітами, понад які вже платно.
- Програма Official Images: курійовані image для
nginx,postgres,redisтощо. Підтримуються Docker Inc і upstream-проектами. - Програма Verified Publisher: image, опубліковані вендорами (наприклад,
mongo,bitnami/...). - Анонімний rate limit на pull: 100 pull на 6 годин на IP. Автентифіковані pull мають вищі ліміти.
- Webhooks на push, інтеграції з GitHub/Bitbucket для autobuild.
- Search і tag-browsing UI на
hub.docker.com.
Якщо прибрати екстри і дивитися лише на протокол, Docker Hub це просто дуже великий registry.
Коли який registry брати
Docker Hub - підходить для: open-source проектів, навчання, публічних image
AWS ECR - підходить для: прод на AWS (без egress fee всередині регіону)
Google GCR/Artifact - підходить для: прод на GCP
Azure ACR - підходить для: прод на Azure
GitHub GHCR - підходить для: GitHub-центричних команд, безкоштовно для публічних
Harbor - підходить для: self-hosted, vulnerability scanning, air-gapped
GitLab Registry - підходить для: GitLab-центричного CI/CD
Quay (Red Hat) - підходить для: enterprise OpenShift workflowПоширений прод-патерн: збирати у CI, пушити у два registry (основний близько до проду, бекап десь ще), деплоїти з основного.
Pull-through кеші і дзеркала
Анонімний rate limit Docker Hub викликав реальні CI-падіння у 2020-2021. Сучасний фікс: pull-through кеші.
твій CI / кластер -> caching mirror (ECR Pull-through, GAR mirror, Harbor) -> Docker Hub
Перший pull іде на Docker Hub один раз, кешується у твоєму mirror. Наступні pull б'ють лише у mirror. Перестаєш палити rate limits, і pull швидші (ближчий мережевий шлях).
Моделі автентифікації
| Registry | Типова auth |
|---|---|
| Docker Hub | Username + personal access token |
| AWS ECR | IAM-роль (aws ecr get-login-password | docker login --password-stdin) |
| Google Artifact Registry | Service account key або workload identity |
| GitHub GHCR | GitHub PAT або GITHUB_TOKEN у Actions |
| Harbor | Robot-акаунти (довгоживучі токени, обмежені проектом) |
| Self-hosted (basic) | htpasswd, OIDC або LDAP |
Команда docker login <registry> працює однаково для всіх. Механізм credential відрізняється.
Типові помилки
Називати Docker Hub «the registry»
Це якийсь registry, не той registry. Сказати «push у registry», не назвавши який, веде новачків у плутанину. «Push у Docker Hub» або «push у наш ECR» точніше.
Забути префікс registry на push
# НЕПРАВИЛЬНО: намагається запушити у Docker Hub під твоїм username
$ docker tag myapp:1.0 myapp:1.0
$ docker push myapp:1.0
# requested access to the resource is denied
# ПРАВИЛЬНО для ECR
$ docker tag myapp:1.0 1234.dkr.ecr.us-east-1.amazonaws.com/myapp:1.0
$ docker push 1234.dkr.ecr.us-east-1.amazonaws.com/myapp:1.0Без префіксу registry Docker припускає Docker Hub. Повідомлення про помилку оманливе.
Натрапити на анонімний rate limit Docker Hub і не помітити
ERROR: toomanyrequests: You have reached your pull rate limit.
You may increase the limit by authenticating and upgrading.Поширене у CI за shared NAT IP. Фікс: автентифікуйся (docker login) або постав pull-through кеш. Анонімний ліміт 100 на 6 годин на IP, зайнятий CI, що шарить з 20 джобами, спалить його за хвилини.
Self-hosting registry без auth
Open-source distribution registry за замовчуванням крутиться без автентифікації. Корисно для тестування, жахливо для проду. Експозований registry це read/write для будь-кого, хто може дістатися. Постав reverse proxy, що робить basic auth, OIDC або повний access control Harbor.
Міксувати registry mirror з credentials
Якщо ти спрямовуєш Docker на приватний mirror через registry-mirrors, той mirror теж потребує твоїх credentials. Поширений дебаг-кейс: image-pull працює локально, але падає у CI, бо mirror налаштований, але CI не автентифікований до нього.
Реальне застосування
- Cloud-native прод: ECR/GCR/ACR для хмари, на якій крутишся. Pull у тому ж VPC-регіоні, тому швидко і без egress.
- Multi-cloud / on-prem: Harbor як єдиний registry між хмарами, з replication-політиками, що дзеркалять image у cloud-specific registry біля кожного регіону.
- Open-source проекти: Docker Hub для публічного image, GHCR-mirror для безкоштовного CI на публічних PR, без Docker Hub rate-limit проблем для contributor'ів.
- Air-gapped середовища (банки, defence, classified): внутрішній Harbor або
distribution-інстанс за one-way синхронізацією з публічних registry. Прод ніколи не дістається публічного інтернету напряму.
Питання для поглиблення
Q: Якщо я пушу в AWS ECR, чи може хтось з Docker зробити pull без використання AWS-інструментів?
A: Лише якщо автентифікується. Сама команда pull це звичайний docker pull, але ECR вимагає IAM-derived токен. aws ecr get-login-password | docker login ... дає короткоживучий токен (12 годин), що daemon використовує. Після цього docker pull працює як зазвичай.
Q: Чи може той самий image жити у кількох registry?
A: Так. Тегни image один раз для кожного registry і запуш:
$ docker tag myapp:1.0 docker.io/youruser/myapp:1.0
$ docker tag myapp:1.0 ghcr.io/youruser/myapp:1.0
$ docker push docker.io/youruser/myapp:1.0
$ docker push ghcr.io/youruser/myapp:1.0Ті самі байти, два будинки. Використовується для надлишковості, міграцій і обслуговування того самого image споживачам у різних екосистемах.
Q: Яка різниця між Docker Hub і GitHub Container Registry?
A: Обидва віддають OCI image. GHCR інтегрований з GitHub: використовує твій GitHub-акаунт, інтегрується з GITHUB_TOKEN у Actions, прив'язує видимість image до видимості репо. Docker Hub незалежний. Для проекту, що хоститься на GitHub, GHCR прибирає один набір credentials і дає безкоштовний публічний хостинг без rate-limit Docker Hub на pull.
Q: Чи можна крутити свій registry?
A: Так. Open-source CNCF проект distribution (раніше docker/distribution) це reference-реалізація. docker run -d -p 5000:5000 registry:2 дає тобі робочий registry за секунди. Для проду використовуй Harbor поверх distribution для auth, сканування і UI. Або крути distribution напряму за nginx з basic auth.
Q: (Senior) Як би ти спроектував image-distribution для глобального Kubernetes-деплою на 50+ регіонів?
A: Регіональний mirror на кластер (або на cloud-регіон), що наповнюється hub-and-spoke реплікацією. Збираєш раз у CI, пушиш у primary registry (Harbor або того, що у твоєї хмари), даєш replication-політиці дзеркалити у кожен регіональний registry. Pull-through кеші обробляють публічні image. Споживачі у кожному регіоні тягнуть лише з найближчого mirror, тому падіння одного registry не зупиняє деплої глобально. Trade-off у операційній складності навколо image freshness і replication lag.
Приклади
Автентифікація проти чотирьох різних registry
# Docker Hub
$ docker login -u myuser # вводиш personal access token
# AWS ECR (токен авторотується кожні 12 годин)
$ aws ecr get-login-password --region us-east-1 \
| docker login --username AWS --password-stdin 123456789.dkr.ecr.us-east-1.amazonaws.com
# GitHub Container Registry
$ echo $GITHUB_PAT | docker login ghcr.io -u myuser --password-stdin
# Self-hosted Harbor
$ docker login harbor.example.com -u robot$ci -p <robot-token>Чотири різних auth-flow, один CLI, чотири записи у ~/.docker/config.json після.
Реплікація image з Docker Hub в ECR
# Pull з Hub
$ docker pull nginx:1.27-alpine
# Tag для ECR
$ docker tag nginx:1.27-alpine \
123456789.dkr.ecr.us-east-1.amazonaws.com/mirror/nginx:1.27-alpine
# Push до ECR
$ docker push 123456789.dkr.ecr.us-east-1.amazonaws.com/mirror/nginx:1.27-alpineТепер твої AWS-навантаження можуть тягти nginx з ECR (всередині регіону, безкоштовно, швидко) замість Hub (cross-region, rate-limited). Прод-сетапи автоматизують це через crane copy або Harbor replication rule.
Запуск приватного registry локально для швидкого тесту
$ docker run -d -p 5000:5000 --name registry registry:2
$ docker tag myapp:1.0 localhost:5000/myapp:1.0
$ docker push localhost:5000/myapp:1.0
The push refers to repository [localhost:5000/myapp]
...
1.0: digest: sha256:9f8e7d6c... size: 1247
$ docker pull localhost:5000/myapp:1.0Повністю робочий registry однією командою. Без auth, без TLS, годиться лише для локального тестування, але показує, що Docker Hub це один конкретний сервер, і будь-яка OCI-spec-сумісна альтернатива взаємозамінна на рівні протоколу.
Коротка відповідь
Для співбесідиКоротка відповідь допоможе вам впевнено відповідати на цю тему під час співбесіди.
Коментарі
Ще немає коментарів