Запропонувати правкуПокращити цю статтюДопрацюйте відповідь до «Що таке Docker registry і чим він відрізняється від Docker Hub?». Ваші зміни проходять модерацію перед публікацією.Потрібне підтвердженняКонтентЩо ви змінюєте🇺🇸EN🇺🇦UAПереглядЗаголовок (UA)Коротка відповідь (UA)**Docker registry** це будь-який сервіс, що зберігає і віддає image, використовуючи OCI Distribution Spec. **Docker Hub** це один конкретний публічний registry, що крутить Docker Inc, і дефолтний, коли робиш `docker pull` без префіксу registry. ```bash $ docker pull nginx # неявно: docker.io (Docker Hub) $ docker pull ghcr.io/myorg/api:1.0 # GitHub Container Registry $ docker pull 1234.dkr.ecr.us-east-1.amazonaws.com/api:1.0 # AWS ECR $ docker pull harbor.internal/team/api:1.0 # self-hosted Harbor ``` **Головне:** Docker Hub це один з прикладів registry. Прод-команди зазвичай обирають інший (ECR, GCR, GHCR, Harbor) заради контролю над auth, мережею і pull rate limits. Той самий формат image, ті самі команди `docker push/pull`, інший хост.Показується над повною відповіддю для швидкого нагадування.Відповідь (UA)Зображення**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 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** ```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-сумісна альтернатива взаємозамінна на рівні протоколу.Для рев’юераПримітка для модератора (необов’язково)Бачить лише модератор. Прискорює рев’ю.