Docker Registry
Your own private container registry - images on a Miget Bucket, unlimited repos, no pull-rate caps.
One-click deploy, from $5/mo on a Miget plan.
This is your own private container registry - the CNCF Distribution registry, the same engine that runs behind Docker Hub - so you can push and pull images over https on your own domain, with basic-auth, and no rate limits.
Image layers are stored on a Miget Bucket (S3-compatible), which means the registry service itself holds no state: redeploys and rollbacks keep every image, and storage scales independently. A thin wrapper writes a clean config from environment variables at boot and builds an htpasswd file from your credentials, so the registry is never accidentally left open.
It pairs naturally with the catalogue’s CI runners (GitHub, GitLab, Forgejo, Buildkite, Azure Pipelines): build images in a runner, push them here, deploy them anywhere - all inside your own infrastructure, with no Docker Hub pull-rate throttling on your deploys.
Upstream project: CNCF Distribution
#what you get
- CNCF Distribution registry - the Docker Hub engine, self-hosted
- Image layers on a Miget Bucket - the service is stateless
- Basic-auth via htpasswd, generated from env at boot
- Listens natively on port 5000, no proxy wrapper
- Unlimited private repositories, no pull-rate limits
- Apache-2.0; OCI-compliant, works with any registry client
#topology
| Service | Role | Public |
|---|---|---|
| registry | registry API (:5000) | yes |
| bucket | Miget Bucket (image layers) | no |
#miget sizing
// this stack needs
256 MiB RAM · 10 GB disk · 1 service
The registry is a thin Go service - 256 MiB is plenty even under concurrent pushes. With S3 storage it keeps no local disk; capacity is the Bucket.
Hobby - recommended fit
$5/mo
1 vCPU · 512 MiB · 10 GiB disk
Headroom for your own apps: 1 GiB at $7/mo
Professional - production
$22/mo
1 vCPU · 2 GiB · 10 GiB disk
Dedicated resources, production SLOs - plan details
One Miget plan is a fixed pool of compute - the whole stack (managed databases included) deploys inside it, and anything left over runs your other apps. No per-service or per-seat math.
#vs. the managed service
What the hosted equivalents charge, against the flat Miget plan this stack fits on. Prices as of June 2026, sources linked.
| Service | Plan | Monthly | What you get |
|---|---|---|---|
| Docker Registry on Miget ★ | 512 MiB plan | $5 | this whole stack, flat - no usage meters, and room left for your own apps |
| Docker Hub | Pro | ~$9 | $9/user/mo annual ($11 monthly); meters pull rates |
| GitHub Packages | private storage | usage-based | ~$0.25/GB-mo storage + $0.50/GB egress for private repos |
Hosted registries meter seats, storage, and pull rates; self-hosted is one small plan plus Bucket storage, unlimited private repos.
#vs. other PaaS
Estimated monthly cost of running this exact stack (256 MiB RAM, 10 GB disk, 1 container) elsewhere, from published June 2026 rates.
| Platform | Est. monthly | Notes |
|---|---|---|
| Miget ★ | $5 flat | compose stacks first-class: one deploy, dedicated vCPU, managed Postgres/Valkey, volumes and TLS all included in the plan |
| Heroku | ~$13 | no volumes; nothing between 1 GB ($50) and 2.5 GB ($250) dynos - 2 GB containers cost far more than shown |
| Render | ~$10 | per-service instances (0.5 GB $7, 2 GB $25) - every container is its own paid service |
| DO App Platform | ~$10 | no persistent volumes - stateful containers need managed DBs/Spaces (base $5 Spaces included here) |
| Railway | ~$4 | usage-based ($10/GB RAM-mo); vCPU billed separately at $20/vCPU-mo on top |
| Fly.io | ~$4 | cheapest sticker price - but burstable shared CPUs (1/16 core; dedicated vCPUs cost ~2-3×), no compose deploys (one app per container, manual wiring), managed DBs billed extra |
Estimates assume RAM fully allocated at published on-demand rates - and sticker price isn't the whole comparison: the cheaper rows buy burstable shared CPUs, per-service wiring instead of a compose deploy, and managed databases billed separately. Heroku and DO App Platform have no persistent volumes at all - stateful stacks like this one need workarounds there.
#deploy it
On Miget
- Create a Compose Stack in app.miget.com pointing at the templates repository
- Set the stack path to
docker-registry -
Set the required variables:
REGISTRY_AUTH_PASSWORD, basic-auth password (with REGISTRY_AUTH_USER)REGISTRY_STORAGE_S3_*, a Miget Bucket: endpoint, bucket, key, secret
- Deploy. Miget layers
compose.miget.yaml(RAM, privacy, volumes, managed services) automatically
Locally first?
Every template is portable, vanilla Docker Compose - the Miget overrides are ignored locally:
git clone https://github.com/deployable-sh/stacks
cd miget-compose-templates/docker-registry
docker compose up -d Same files, same behavior. The template README covers connection strings and scaling notes.
#faq
What does this save vs Docker Hub or GitHub Packages?
Docker Hub’s Pro plan is $9/user/month and it meters pull rates; GitHub Packages bills private storage and egress. A self-hosted registry is one small plan (around $5-13/month) plus Bucket storage, with unlimited private repos and no pull throttling.
Why does it need a wrapper instead of the stock image?
Miget configures images through environment variables only, and the stock image ships a filesystem config that conflicts with S3 settings. The wrapper writes a clean config.yml from env (filesystem or S3) and generates the htpasswd file, so the registry comes up correctly and never open by accident.
Can my CI push to it?
Yes. Run `docker login your-app.migetapp.com` with the credentials you set, then push and pull as normal. The catalogue’s CI runners can build and push images to it inside your own network.
Ship Docker Registry today
One compose stack, 256 MiB of RAM, from $5/month flat, and it runs on your laptop with the same files.