How to Set Up a Local Container Registry with Podman | Complete Guide

By Dmitri Meshin
Picture of the author
Published on
Setting Up a Local Container Registry with Podman

๐Ÿš€ Setting Up a Local Container Registry with Podman

If you've ever wondered if Docker Hub downtime was a cruel joke by the container gods, or just love being the master of your digital domain, setting up a local container registry with Podman is your ticket to freedom.

This detailed guide walks you step-by-step through creating your own local registry, complete with persistent storage, troubleshooting tips, and some jokes along the way. Say goodbye to network lag, rate limits, and dependency headaches!

๐Ÿ“ฆ What You'll Need

  • A Linux machine (tested on Fedora, but Ubuntu or CentOS should work fine).
  • Podman installed (sudo dnf install podman or sudo apt install podman).

โš™๏ธ Step 1: Launch the Registry

Start your local registry container using the official Docker registry image:

podman run -dt -p 5000:5000 \
  --name my-registry \
  docker.io/library/registry:2

Check to ensure it's up:

podman ps
# If itโ€™s not there, maybe your cat unplugged the server again.

๐Ÿ” Inspecting the Running Container

Make sure your container is listening on the correct port:

podman inspect my-registry | grep IPAddress

๐Ÿ’พ Step 2: Persistent Storage (Because Nobody Likes Losing Stuff)

Your images should persist even after reboots or container restarts. Stop the existing container first:

podman rm -f my-registry

Now restart with persistent storage using named volumes:

podman run -dt -p 5000:5000 \
  --name my-registry \
  -v registry-data:/var/lib/registry:Z \
  docker.io/library/registry:2

Verify the volume is created:

podman volume inspect registry-data

This ensures images survive even if your container crashes or your machine reboots.

๐Ÿงช Step 3: Let's Test This Thing

We'll use Alpine Linux for simplicity (it's basically the "hello world" of container images).

  1. Pull the Alpine image:
podman pull docker.io/library/alpine
  1. Tag the image for your local registry:
podman tag alpine localhost:5000/my-alpine
  1. Push it to your local registry:
podman push localhost:5000/my-alpine --tls-verify=false
  1. Check it's there:
podman search localhost:5000/ --tls-verify=false
  1. Pretend disaster and remove your images:
podman rmi localhost:5000/my-alpine alpine
  1. Pull it back from your registry (victory dance time!):
podman pull localhost:5000/my-alpine --tls-verify=false

If this works, congrats! You're now the proud owner of a local registry that will never ghost you (unlike some cloud services we know).

๐Ÿ“Œ Step 4: Managing Your Images

Listing Images in Your Registry

To see what images you've stored:

podman search localhost:5000 --tls-verify=false

Deleting Images

If you ever need to clean up specific images:

curl -X DELETE http://localhost:5000/v2/my-alpine/manifests/$(curl -s -H "Accept: application/vnd.docker.distribution.manifest.v2+json" -X GET http://localhost:5000/v2/my-alpine/manifests/latest | grep Docker-Content-Digest | awk '{print ($3)}' | tr -d ',"')

Automated Backups

Consider automating backups of your registry data:

podman run --rm -v registry-data:/registry alpine tar czf - /registry > registry-backup.tar.gz

๐Ÿงน Step 5: Cleaning Up (Optional, but Recommended)

Want to tidy up after you're done experimenting?

podman rm -f my-registry
podman volume rm registry-data
podman rmi docker.io/library/registry:2

๐Ÿ—๏ธ Step 6: Production-Level Enhancements (Level-Up!)

For production use, make sure you implement these best practices:

  • TLS certificates: Don't run around with --tls-verify=false in production unless your goal is chaos.
  • Authentication: Secure your registry with basic auth or token-based systems.
  • Monitoring and backups: Because "works on my machine" is not a disaster recovery plan. Automate backups and set up monitoring tools like Prometheus.

๐Ÿšง Common Pitfalls and Troubleshooting

  • Port Conflicts: Make sure port 5000 isn't already occupied by another service (or that forgotten Python script).
  • SELinux Context: The :Z option ensures SELinux doesn't throw a tantrum by properly setting context.

If something doesn't work, always check container logs:

podman logs my-registry

๐Ÿ”ฎ Wrapping Up

You've successfully set up your very own container registry, free from external outages, latency issues, and pesky rate limits. Embrace the power of local control!

What are you deploying next? Let us know your adventures in container-land!

Happy containerizing! ๐Ÿš€

Stay Tuned

Want to become a Next.js pro?
The best articles, links and news related to web development delivered once a week to your inbox.