A 10-person team that upgrades to Docker Team just to stop CI from hitting 429s pays $1,800 a year for a feature it never asked for: unlimited pulls. A Harbor registry running on a spare 4-vCPU node the same team's Cluster API fleet already manages costs roughly $200-300 a year — and that's the pessimistic case where it doesn't share a box that's already running something else.
That gap is the actual number this post works through, not a vague "self-hosting saves money" gesture. Docker's 2026 pricing moves — a Pro plan that went from $5 to $9/month, a Team plan that went from $9 to $15 per seat — arrived at the same time as its pull-rate limits, and the two together push a surprising number of teams into a paid tier they don't need for anything except making the rate limit go away.
What Actually Changed in 2026
Docker's plan pricing moved twice in the last two years, and the 2026 revision landed hardest on the tiers a small team actually buys:
| Plan | Old price | 2026 price | Increase |
|---|---|---|---|
| Pro (annual) | $5/month | $9/month | 80% |
| Pro (monthly) | $7/month | $11/month | 57% |
| Team (annual) | $9/user/month | $15/user/month | 67% |
| Team (monthly) | $11/user/month | $16/user/month | 45% |
| Business | — | $24/user/month | — |
Pull rate limits moved alongside the price, not away from it. As of the April 2025 rate-limit revision that's still in force through 2026, unauthenticated pulls are capped at 10 per hour per IP address, a free authenticated Docker Personal account gets 100 pulls per hour, and Pro/Team/Business accounts get unlimited pulls under a fair-use policy. (If you've seen "40 pulls/hour" cited for Docker Personal, that's the pre-2025 number — the current authenticated free-tier ceiling is 100/hour.)
Here's the part that matters for a CI pipeline: unlimited pulls is the only reason most teams touch Team or Business. Docker Scout's vulnerability scanning, unlimited repos, and the other headline features on those tiers are real, but the thing that actually forces an upgrade — the thing that shows up as a build failure at 2pm on a Tuesday — is the rate limit.
The Worked Math: When a Free-Tier CI Pipeline Blows Its Ceiling
A "busy" pipeline doesn't need to be that busy to clear 100 pulls in an hour. Take a realistic setup: a repo with 10 active contributors, CI running on every push and every PR update, and a per-build pull count that's typical for anything beyond a single static binary:
- Base image (e.g.,
node:20-slim,python:3.12-slim): 1 pull - Test-dependency image (a database or cache for integration tests —
postgres:17,redis:7): 1-2 pulls - CI tooling images (linter, security scanner, build-cache sidecar): 1-2 pulls
- Multi-stage builds pulling a separate builder base: 1 pull
That's 4-6 pulls per CI run before counting retries. A single developer pushing three times in an hour (a normal rebase-and-fix cycle) already burns 12-18 pulls. Scale that to a 10-person team where a morning stand-up triggers a wave of pushes — five people push within the same 15-minute window, each triggering a build, each build running 2-3 parallel jobs (lint, test, build) that each pull the base image independently — and a single burst can hit 60-90 pulls in under 20 minutes. Add a nightly regression suite that spins up 15 parallel jobs against a database image and a message-queue image, and the free tier's 100/hour ceiling is gone before lunch.
The practical failure mode isn't a slow degradation — it's a wall. Docker Hub returns 429 Too Many Requests, the build fails, and the fix that actually works (as opposed to staggering builds, which nobody maintains for long) is upgrading to a plan with unlimited pulls. For a 10-person team, that's Docker Team: $15/seat/month × 10 seats = $150/month, or $1,800/year — paid entirely to make a rate limit disappear, not because the team wanted Docker Scout's unlimited repo scanning or any other Team-tier feature.
Shared CI infrastructure makes this worse before it makes it better. GitHub Actions' shared runners pull from a shared IP range, so even the 10-pulls-per-hour unauthenticated limit gets exhausted by other tenants' traffic before your own build runs — which is exactly why authenticating to Docker Hub in CI is table stakes now, and why that authenticated ceiling is the number that actually governs whether your pipeline stays green.
What Harbor Costs Instead
Harbor is a CNCF-graduated, Apache-2.0 container registry that adds the things a team actually wants from a registry — vulnerability scanning (via Trivy), image signing (Cosign/Notation), RBAC, and multi-registry replication — on top of the same OCI-compliant storage layer Docker Hub itself is built on. It's free software; the cost is the machine it runs on and the operational time to run it.
Hardware. Harbor's documented minimum is 2 CPU cores, 4GB RAM, and 40GB disk; the recommended production spec is 4 CPU cores, 8GB RAM, and 160GB disk. On Hetzner's current (post-2026-price-hike) lineup, a CX32 — 4 vCPU, 8GB RAM — runs in the same ballpark as a small dedicated web service, roughly €15-20/month depending on region and whether you're on the shared-vCPU or cost-optimized line. Call it $200-300/year for a dedicated node sized to Harbor's recommended spec.
That's the pessimistic number. A team already running a Cluster API-managed fleet for its app hosting — the same fleet doing the actual deploys — doesn't need a dedicated Harbor box at all. Harbor is just another workload: it schedules onto existing node-pool capacity the same way any other service does, and the marginal cost is whatever slack the fleet already has, which for a team running more than a couple of nodes is frequently $0 in new hardware spend.
Feature parity, not feature loss. The comparison isn't "cheaper but worse":
| Capability | Docker Hub (paid tier) | Harbor (self-hosted) |
|---|---|---|
| Vulnerability scanning | Docker Scout | Trivy, built in |
| Image signing | Content trust (limited) | Cosign + Notation |
| Replication | Not applicable (you are the source) | Policy-based, multi-registry |
| RBAC | Org/team-level | Project-level, fine-grained |
| Pull rate limit | Unlimited (fair use) on paid tiers | No limit — it's your infrastructure |
| Retention policy | Fixed by plan | Fully configurable |
Harbor's replication and retention-policy features are things Docker Hub doesn't offer at any price, because they only make sense when you control the storage layer. A team migrating build artifacts between regions, or enforcing "delete untagged images after 14 days" without manual cleanup, gets that for free with Harbor and pays extra (or does without) on Docker Hub.
The Side-by-Side Total
| Docker Team (10 seats) | Harbor, dedicated node | Harbor, existing fleet | |
|---|---|---|---|
| Annual cost | $1,800 | ~$200-300 | ~$0 marginal |
| What you're buying | Unlimited pulls | Unlimited pulls + scanning + replication | Same, no new spend |
| Ops burden | None (managed) | Postgres, Redis, storage backend, upgrades | Same, folded into existing fleet ops |
The delta is real — roughly $1,500-1,800/year for a mid-size team, scaling with headcount since Docker Team bills per seat and a self-hosted registry doesn't bill per seat at all. A 30-person team on Docker Team pays $5,400/year for the identical unlimited-pulls feature that costs a self-hosted Harbor instance nothing extra in licensing and, at most, one more node.
Where Self-Hosting a Registry Isn't Worth It
This isn't a blanket "always self-host" argument. A two-person team running a handful of builds a day never approaches the 100-pulls-per-hour free ceiling, and standing up Harbor for that team trades a $0 bill for a Postgres instance, a Redis instance, and a storage backend someone has to patch and back up. The math in this post only bites once pull volume — not team size on its own — starts triggering 429s regularly enough that the "just upgrade the plan" fix becomes a recurring line item rather than a one-time decision.
The tell is concrete: if your CI logs show 429 Too Many Requests from Docker Hub more than once a month, you've already crossed the point where the free tier stopped being free — you're either paying in upgraded seats or in flaky builds. That's the moment the Harbor math above is worth running against your own numbers.
Owning the Registry Alongside the Deploys
The strongest version of this argument isn't "Harbor is cheaper than Docker Team" in isolation — it's that a platform already running a Cluster API-managed fleet to build and deploy tenant apps has no structural reason to route its own image pulls through a third party's metered registry at all. The machines are already there. The Kubernetes-style scheduling that places workloads is already there. Adding a registry is adding one more workload to infrastructure you own, not standing up a new vendor relationship with its own pricing page to watch.
Bex.co is the open-source, AI-native Render alternative — push a git repo, get a running HTTPS service on machines you own. If your CI pipeline is already paying Docker's per-seat tax to dodge a rate limit, the same owned-hardware fleet that runs your deploys can run your registry too. Star the repo on GitHub or deploy your first app today.
Sources:
- Docker Plans FAQs
- Docker Pricing 2026: 4 Plans from $11–$24/user/month
- GitLab: Docker Hub rate-limiting impacts CI/CD pipelines
- Docker Hub Rate Limits community discussion
- Harbor GitHub repository
- CNCF Harbor Project Journey Report
- Harbor Installation Prerequisites
- Hetzner Cloud Review 2026: Benchmarks, Pricing, and the Real Trade-offs
- Hetzner Cloud Pricing After the April 2026 Increase



