Skip to main content

Що таке 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 операцією.

Швидкий приклад

bash
# Той самий формат 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 image
  • GET /v2/<name>/blobs/<digest>, отримати layer або config blob
  • PUT /v2/<name>/manifests/<tag>, запушити manifest
  • POST /v2/<name>/blobs/uploads/ потім PATCH/PUT, запушити blob
  • DELETE /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 HubUsername + personal access token
AWS ECRIAM-роль (aws ecr get-login-password | docker login --password-stdin)
Google Artifact RegistryService account key або workload identity
GitHub GHCRGitHub PAT або GITHUB_TOKEN у Actions
HarborRobot-акаунти (довгоживучі токени, обмежені проектом)
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

bash
# НЕПРАВИЛЬНО: намагається запушити у 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 і запуш:

bash
$ 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

bash
# 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

bash
# 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 локально для швидкого тесту

bash
$ 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-сумісна альтернатива взаємозамінна на рівні протоколу.

Коротка відповідь

Для співбесіди
Premium

Коротка відповідь допоможе вам впевнено відповідати на цю тему під час співбесіди.

Коментарі

Ще немає коментарів