Як налаштувати приватний Docker registry (Harbor)?
Harbor це домінантний open-source приватний container-registry. Обгортає базовий OCI Distribution spec (той самий протокол, що Docker Hub) з прод-фічами, що on-prem і enterprise команди реально потребують.
Теорія
TL;DR
- Open-source registry, побудований на CNCF distribution. CNCF graduated з 2020.
- Понад звичайний registry: RBAC, multi-tenant projects, vulnerability scanning (Trivy/Clair), image signing (Notary, Cosign), replication до інших registry, retention-policies, garbage collection, OIDC/LDAP auth.
- Deploy через Compose для single-node або Helm chart для HA на Kubernetes.
- Використовується як on-prem альтернатива AWS ECR / Google GCR / Docker Hub, коли air-gapped, multi-region або compliance-driven.
- Говорить звичайним
docker pull/push, твій існуючий CI/CD не змінюється.
Архітектура
+----------+ +----------+ +-----------+
| nginx / | | core | | registry |
| portal | -> | (API) | -> | (CNCF |
| | | + jobsvc | | distrib.) |
+----------+ +----------+ +-----------+
| | |
v v v
+-----+ +--------+ +-------+
| UI | | trivy | | redis |
+-----+ | scanner| +-------+
+--------+
|
v
+-----------+
| postgres |
+-----------+Дюжина container, що крутяться разом (web UI, API, DB, Redis, registry, scanner тощо). Compose-installer піднімає усе.
Single-node install (Compose)
# Завантаження
wget https://github.com/goharbor/harbor/releases/download/v2.11.0/harbor-online-installer-v2.11.0.tgz
tar xzf harbor-online-installer-v2.11.0.tgz
cd harbor
# Налаштування
cp harbor.yml.tmpl harbor.yml
vi harbor.yml
# hostname: harbor.example.com
# https.port: 443
# https.certificate: /etc/cert/fullchain.pem
# https.private_key: /etc/cert/privkey.pem
# harbor_admin_password: <сильний-pw>
# database.password: <db-pw>
# Install з Trivy scanner
sudo ./install.sh --with-trivy
# Піднімає ~10 container через docker composeВідкрий https://harbor.example.com → log in як admin з паролем з harbor.yml.
Push/pull
# Log in
docker login harbor.example.com -u admin -p <password>
# Tag і push
docker tag myapp:1.0 harbor.example.com/myproject/myapp:1.0
docker push harbor.example.com/myproject/myapp:1.0
# Pull з іншого host
docker pull harbor.example.com/myproject/myapp:1.0Harbor говорить тим самим протоколом, що Docker Hub. CI/CD-скрипти лише міняють hostname registry.
Projects і RBAC
Harbor групує image у projects. Кожен project це namespace зі своїм:
- Видимістю: private (auth потрібна) або public (без auth для pull).
- Member-ролями: Project Admin, Maintainer, Developer, Guest.
- Vulnerability scan policies.
- Retention policies.
- Replication rules.
Типовий multi-tenant setup: один Harbor-інстанс, один project на команду. Project Admins керують image своєї команди; cross-project доступ контролюється.
Vulnerability scanning
З --with-trivy Harbor включає вбудований scanner:
- Scan на push (налаштовується per project).
- Заплановані re-scan усіх image.
- CVE-результати видно у UI; gate pull за severity («prevent vulnerable images»).
- Tag, marked unsafe, блокують деплої через admission policy.
# У project-налаштуваннях
Vulnerability Scanning: enabled
Prevent vulnerable images: HIGH and above
Auto-scan on push: trueReplication
Harbor може дзеркалити image до і з інших registry:
- Pull-through cache: налаштуй Docker Hub як remote, Harbor кешує pull. Прискорює завантаження, переживає Docker Hub rate-limits.
- Push до іншого Harbor: multi-region setup'и реплікують прод-image у Harbor кожного регіону.
- Push до Docker Hub / ECR / GCR: розподіляй по кількох registry з одного source.
# Replication rule
Name: replicate-to-eu
Mode: pull / push / event-based
Filter: project=prod, tag=v*
Destination: harbor-eu.example.com
Trigger: scheduled / manual / on-pushImage signing
Два варіанти:
- Notary v1 (вбудовано, DCT-сумісно) — підписує image-manifest.
- Cosign / Sigstore (сучасно) — підписує OCI-артефакти. Все частіше дефолт.
Enforce «лише підписані image деплояться» через admission control (Kyverno, sigstore-policy-controller).
Retention-policies
Без retention кожен PR-білд накопичується назавжди. Harbor дозволяє ставити правила:
Retain: останні 10 push-tag
Exclude: tag, що матчать v* (тримай усі release-tag)
Apply to: project=stagingGarbage collection крутиться у scheduled-job; звільнене місце reclaim'ається.
HA install (Helm)
Для проду крути Harbor на Kubernetes:
helm repo add harbor https://helm.goharbor.io
helm upgrade --install harbor harbor/harbor \
--set expose.type=ingress \
--set externalURL=https://harbor.example.com \
--set persistence.enabled=true \
--set persistence.persistentVolumeClaim.registry.size=500GiРеплікує сервіси між node; персистентні volume для registry-storage і Postgres. Переживає node-failure, якщо backed by network storage.
Типові помилки
Забути налаштувати TLS
Дефолти harbor.yml припускають HTTP для тестування. Прод вимагає HTTPS — Docker daemon відмовляє push на untrusted HTTP-registry за замовчуванням. Згенеруй серти (Let's Encrypt, internal CA) і налаштуй https: блок у harbor.yml.
Запуск на тому самому host, що критичні навантаження
Registry, що хостить твої прод-image, сам критична інфраструктура. Якщо крашиться, не можеш деплоїти. Крути на dedicated-залізі або своєму K8s-кластері.
Без retention-policy → диск переповнюється
2 TB CI-білдів накопичено.
Backup-вікно: 12 годин.
Recovery-вікно: нервово.Став retention-policies з першого дня. Garbage collection scheduled щотижня мінімум.
Відсутність storage-backup
Harbor Postgres має метадані; filesystem registry має реальні blob. Обидва потребують backup. Втрата метаданих = image osirотіли. Втрата blob = метадані вказують у нікуди.
Деплой без scanning
Якщо маєш Harbor з Trivy і не вмикаєш scanning, ти платиш за фічу і не використовуєш. Мінімум: scan-on-push для усіх project.
Реальне застосування
- On-prem enterprise: фінанси, healthcare, telecom — Harbor дефолт для self-hosted регульованих середовищ.
- Multi-cloud: Harbor як центральний registry, з replication до AWS ECR / GCR для region-local pull.
- Air-gapped: classified мережі, де public-інтернет заборонено; Harbor + Trivy DB-update через offline sync.
- Open-source проекти: деякі тримають свій Harbor для community-built image.
- Pull-through cache: Harbor кешував Docker Hub для тисяч CI-runs без удару у rate-limit.
Питання для поглиблення
Q: Яка різниця між Harbor і голим registry:2 image?
A: registry:2 це базовий CNCF distribution-server — pull/push, усе. Harbor обгортає auth, RBAC, UI, scanning, signing, replication. Для toy-use або швидкого local-testing бери registry:2. Для реального проду Harbor.
Q: Чи Harbor може scan'ити image з external-registry?
A: Лише image, збережені у Harbor. Щоб scan'ити external, налаштуй replication, щоб затягувати їх у Harbor.
Q: Як Harbor обробляє storage?
A: Filesystem (дефолт), S3-сумісний (AWS S3, Minio, GCS, Azure Blob) або Swift. Налаштовується через storage-секцію harbor.yml.
Q: Чи можу крутити Harbor у HA?
A: Так — Helm chart з кількома replica, external Postgres (HA), external Redis (HA), shared storage-backend (S3 або NFS). Single-node Compose-install для малих/staging; прод = HA.
Q: (Senior) Як спроектувати Harbor для глобального multi-region деплою?
A: Центральний «hub» Harbor, куди CI пушить; «spoke» Harbor у кожному регіоні для low-latency pull. Hub-to-spoke replication on event (push тригерить replica-push за хвилини). Spoke-storage використовує cloud-region-local object-store (S3, GCS). Hub backed up offsite. Прод K8s у кожному регіоні pull'ить зі свого spoke; якщо spoke down, fallback на hub. Audit-логи централізовано через syslog. Дизайн: image авторитетно у hub, розподілено для performance, survive'абельне для resilience.
Приклади
Compose-based small install
# Після того, як install.sh завершується, маєш:
$ docker compose ps
NAME IMAGE STATUS
harbor-core goharbor/harbor-core running
harbor-db goharbor/harbor-db running
harbor-jobservice goharbor/harbor-jobservice running
harbor-portal goharbor/harbor-portal running
harbor-registry goharbor/registry-photon running
harbor-trivy-adapter goharbor/trivy-adapter running
nginx goharbor/nginx-photon running
redis goharbor/redis-photon running
# ... ~10 сервісів
$ curl -k https://harbor.example.com/api/v2.0/health
{"status":"healthy","components":[...]}CI-інтеграція
# GitHub Actions
- uses: docker/login-action@v3
with:
registry: harbor.example.com
username: ci-robot
password: ${{ secrets.HARBOR_TOKEN }}
- uses: docker/build-push-action@v5
with:
push: true
tags: harbor.example.com/myproject/api:${{ github.sha }}Robot-акаунти Harbor (long-lived API-токени) це стандартний CI auth-патерн.
Replication: Docker Hub pull-through cache
Harbor settings → Registries
Add registry: type=docker-hub, url=https://hub.docker.com
Project "library" → Replications
Pull-based replication, source=docker-hub, filter=*nginx*Тепер docker pull harbor.example.com/library/nginx:1.27 реально pull'ить з Docker Hub (якщо не закешовано), потім обслуговує з Harbor на наступних pull. Rate-limits Docker Hub per-IP, твій Harbor це один IP, значно важче вдарити у ліміти.
Коротка відповідь
Для співбесідиКоротка відповідь допоможе вам впевнено відповідати на цю тему під час співбесіди.
Коментарі
Ще немає коментарів