A practical guide to self-hosted Docker image hosting using Zot, Docker Compose, Backblaze B2, private access, RBAC, retention, audit logs, and GitHub Actions.

I use Docker images for personal projects, client deployments, and services running on my own servers. At some point, I wanted private Docker image hosting without tying every deployment to Docker Hub or GitHub Container Registry.

The standard name for this kind of service is a private Docker registry. It stores image layers and lets developers, CI systems, and servers push and pull images using normal Docker commands. Modern registries usually support the broader OCI standard too, which means they can store more than Docker images.

My requirements were simple:

Private push and pull access