So Podman is an open source container engine like Dockerâwith "full"1 Docker compatibility. IMO Podmanâs main benefit over Docker is security. But how is it more secure? Keep readingâŠ
Docker traditionally runs a daemon as the root user, and you need to mount that daemonâs socket into various containers for them to work as intended (See: Traefik, Portainer, etc.) But if someone compromises such a container and therefore gains access to the Docker socket, itâs game over for your host. That Docker socket is the keys to the root kingdom, so to speak.
Podman doesnât have a daemon by default, although you can run a very minimal one for Docker compatibility. And perhaps more importantly, Podman can run entirely as a non-root user.2 Non-root means if someone compromises a container and somehow manages to break out of it, they donât get the keys to the kingdom. They only get access to your non-privileged Unix user. So like the keys to a little room that only contains the thing they already compromised.2.5 Pretty neat.
Okay, now for the annoying parts of Podman. In order to achieve this rootless, daemonless nirvana, you have to give up the convenience of Unix users in your containers being the same as the users on the host. (Or at least the same UIDs.) Thatâs because Podman typically3 runs as a non-root user, and most containers expect to either run as root or some other specific user.
The "solution"4 is user re-mapping. Meaning that you can configure your non-root user that Podman is running as to map into the container as the root user! Or as UID 1234. Or really any mapping you can imagine. If that makes your head spin, wait until you actually try to configure it. Itâs actually not so bad on containers that expect to run as root. You just map your non-root user to the container UID 0 (root)⊠and Bobâs your uncle. But it can get more complicated and annoying when you have to do more involved UID and GID mappingsâand then play the resultant permissions whack-a-mole on the host because your volumes are no longer accessed from a container running as host-rootâŠ
Still, itâs a pretty cool feeling the first time you run a ârootâ container in your completely unprivileged Unix user and everything just works. (After spending hours of swearing and Duck-Ducking to get it to that point.) At least, it was pretty cool for me. If itâs not when you do it, then Podman may not be for you.
The other big annoying thing about Podman is that because thereâs no Big Bad Daemon managing everything, there are certain things you give up. Like containers actually starting on boot. Youâd think thatâd be a fundamental feature of a container engine in 2023, but youâd be wrong. Podman doesnât do that. Podman adheres to the âUnix philosophy.â Meaning, briefly, if Podman doesnât feel like doing something, then it doesnât. And therefore expects you to use systemd for starting your containers on boot. Which is all good and well in theory, until you realize that means Podman wants you to manage your containers entirely with systemd. So⊠running each container with a systemd service, using those services to stop/start/manage your containers, etc.
Which, if you ask me, is totally bananasland. I donât know about you, but I donât want to individually manage my containers with systemd. I want to use my good old trusty Docker Compose. The good news is you can use good old trusty Docker Compose with Podman! Just run a compatibility daemon (tiny and minimal and rootless⊠donât you worry) to present a Docker-like socket to Compose and boom everything works. Except your containers still donât actually start on boot. You still need systemd for that. But if you make systemd run Docker Compose, problem solved!
This isnât the âPodman Wayâ though, and any real Podman user will be happy to tell you that. The Podman Way is either the aforementioned systemd-running-the-show approach or something called Quadlet or even a Kubernetes compatibility feature. Briefly, about those: Quadlet is âjustâ a tighter integration between systemd and Podman so that you can declaratively define Podman containers and volumes directly in a sort of systemd service file. (Well, multiple.) Itâs like Podman and Docker Compose and systemd and Windows 3.1 INI files all had a bastard love childâand itâs about as pretty as it sounds. IMO, youâd do well to stick with Docker Compose.
The Kubernetes compatibility feature lets you write Kubernetes-style configuration files and run them with Podman to start/manage your containers. It doesnât actually use a Kubernetes cluster; it lets you pretend youâre running a big boy cluster because your command has the word âkubeâ in it, but in actuality youâre just running your lowly Podman containers instead. It also has the feel of being a dev toy intended for local development rather than actual production use.5 For instance, thereâs no way to apply a change in-place without totally stopping and starting a container with two separate commands. What is this, 2003?
Lastly, thereâs Podman Compose. Itâs a third-party project (not produced by the Podman devs) thatâs intended to support Docker Compose configuration files while working more ânativelyâ with Podman. My brief experience using it (with all due respect to the devs) is that itâs total amateur hour and/or just not ready for prime time. Again, stick with Docker Compose, which works great with Podman.
Anyway, thatâs all Iâve got! Use Podman if you want. Donât use it if you donât want. Iâm not the boss of you. But you said you wanted content on Lemmy, and now youâve got content on Lemmy. This is all your fault!
1 Where âfullâ is defined as: Not actually full.
2 Newer versions of Docker also have some rootless capabilities. But theyâve still got that stinky olâ daemon.
2.5 Itâs maybe not quite this simple in practice, because youâll probably want to run multiple containers under the same Unix account unless youâre really OCD about security and/or have a hatred of the convenience of container networking.
3 You can run Podman as root and have many of the same properties as root Docker, but then whatâs the point? One less daemon, I guess?
4 Where âsolutionâ is defined as: Something that solves the problem while creating five new ones.
5 Spoiler: Red Hatâs whole positioning with Podman is like they see it is as a way for buttoned-up corporate devs to run containers locally for development while their âproductionâ is running K8s or whatever. Personally, I donât care how they position it as long as Podman works well to run my self-hosting shitâŠ
At least podman does not circumvent my firewall (ufw) like docker did. Had to use a workaround to get it to work with docker.
Podman respects UFW?? Thatâs awesome to hear.
Yep, turns out it doesnât insert its own iptables rules like docker does, so the special rules from ufw-docker werenât necessary anymore.
âŠand of course I learn this after switching to firewalld.
At least firewalld feels relatively painless compared to rest of the redhat-container-verse.