Self-Hosting a Container Registry
A guide on container registries and self-hosting one.
What is a Container Image?
Before we talk about container registries, let's first understand what a container image is. In a nutshell a container image is a package that includes all of the files, libraries, and configurations to run a container. They are composed of layers where each layer represents a set of file system changes that add, remove, or modify files.
The most common way to create a container image is to use a Dockerfile.
# build an image
docker build -t pliutau/hello-world:v0 .
# check the images locally
docker images
# REPOSITORY TAG IMAGE ID CREATED SIZE
# hello-world latest 9facd12bbcdd 22 seconds ago 11MBThis creates a container image that is stored on your local machine. But what if you want to share this image with others or use it on a different machine? This is where container registries come in.
What is a Container Registry?
A container registry is a storage catalog where you can push and pull container images from. The images are grouped into repositories, which are collections of related images with the same name. For example, on Docker Hub registry, nginx is the name of the repository that contains different versions of the nginx images.
Some registries are public, meaning that the images hosted on them are accessible to anyone on the Internet. Public registries such as Docker Hub are good option to host open-source projects.
On the other hand private registries provide a way to incorporate security and privacy into enterprise container image storage, either hosted in cloud or on-premises. These private registries often come with advanced security features and technical support. There is a growing list of private registries available such as Amazon ECR, GCP Artifact Registry, GitHub Container Registry, also Docker Hub offers a private repository feature.
As developer you interact with a container registry when using the docker push and docker pull commands.
docker push docker.io/pliutau/hello-world:v0
# In case of Docker Hub we could also skip the registry part
docker push pliutau/hello-world:v0Let's look at the anatomy of a container image URL.
docker pull docker.io/pliutau/hello-world:v0@sha256:dc11b2...
| | | |
↓ ↓ ↓ ↓
registry repository tag digest


