/home/posts/docker-compose-podman

Replacing Docker Compose with Podman (Debian)

Published on

#Why Podman?

If you host anything using Docker, you’ve probably heard of podman, which is advertised as a drop-in replacement for Docker with the advantages of being daemonless and rootless (except for its docker-compose functionality, which we will get into). DYOR, but podman is a very appealing and future-oriented alternative to Docker.

Fortunately for us, podman v3.0.0 included initial support for Docker Compose, which we will be using in this guide. The podman community is also great, and #podman was very helpful with the transition from docker-compose.

The majority of existing guides are limited to Fedora/RHEL and don’t work on Debian, so I wrote this guide specifically for those looking to replace Docker Compose with podman on Debian.

#Replace Docker Compose with Podman

#1. Install Podman

First, we need to install podman (duh). Podman is only available via the Bullseye (Debian 11) repository, and as of today (May 7, 2021), this requires upgrading to Debian testing. Or, you can try to install podman via source, but this guide won’t cover that.

bash

$ sudo apt install podman

#2. Swap Services

Before stopping docker altogether, go through and docker-compose stop all your services, until docker ps shows no running containers, then continue.

Essentially, docker uses two systemd services, docker.service and docker.socket. In a similar fashion, podman provides podman.service and podman.socket. The docker socket is available (on Debian) at /var/run/docker.sock, and the podman socket is at /run/podman/podman.socket. These locations will be important in a minute.

Next, we need to swap the services that we’re running:

bash

$ sudo systemctl disable --now docker.service docker.socket
$ sudo systemctl enable --now podman.service podman.socket

To verify that the podman socket is listening, you can run the following:

bash

$ sudo curl -v --unix-socket /run/podman/podman.sock http://localhost/_ping

You should see OK at the end.

#3. Set up Container Registry List

Unlike Docker, which defaults to docker.io, podman does not prefer any specific container registry list by default. It must be configured at /etc/containers/registries.conf so it knows to grab containers from docker.io. You can read more about this file here, but I’ll give you the easy version.

Open up the file and add the following line, or change the commented line that looks similar:

/etc/containers/registries.conf

yaml

unqualified-search-registries = ['docker.io']

If you want your container images from somewhere else, just add a different URL.

#4. Run Docker Compose

At this point, if you were to try and run docker-compose up, you’d get the following error:

bash

$ docker-compose up -d
ERROR: Couldn't connect to Docker daemon at http+docker://localhost - is it running?

If it's at a non-standard location, specify the URL with the DOCKER_HOST environment variable.

Essentially, we just shut down the Docker socket, so docker-compose doesn’t know where to go. From this point forward, if you want to run a docker-compose command, you must prepend the command by pointing it to the podman socket via the DOCKER_HOST environment variable, just like the error message suggested.

Now, let’s bring up the containers again, this time using podman’s socket:

bash

$ sudo DOCKER_HOST=unix:///run/podman/podman.sock docker-compose up -d

You should see podman creating networks and volumes, pulling images, and creating containers just like docker did.

#Conclusion

Boom, you just dropped Docker and swapped to Podman. Pretty easy, right? It gets better: in an upcoming release, podman is dropping the root requirement for docker-compose, so look forward to an update!

Meet the Author

John Allbritten

Nashville, TN

I love learning new technologies, and I have a passion for open source. As I learn things, my notes turn into articles to share.

Keep Reading