Docker and Podman both build container images and run containers, and their commands are almost identical. The difference is underneath: Docker usually works through a background service called a daemon, while Podman has no daemon and is built to run containers without root.
What both of them do
A container packs an app with its dependencies, so it runs the same on a laptop, a CI server and production. Both tools cover the same everyday jobs:
- Build an image from a Dockerfile (Podman reads the same file, sometimes named a Containerfile).
- Pull images from registries such as Docker Hub.
- Run, stop and inspect containers.
Both build images to the same open standard from the Open Container Initiative (OCI), so an image built with one runs on the other. If containers are new to you, start with Docker explained and come back.
Docker: a daemon does the work
Docker uses a client-server design. The docker command you type is only a client. It sends your request to a daemon: a background service, dockerd, that is always running and waiting for commands. The daemon pulls images, creates containers and keeps track of them.
That design has real strengths. Every tool, from the CLI to IDE plugins to CI systems, talks to one service in one way, and the daemon can restart containers by itself when the machine reboots.
It also has costs. The daemon is one long-running process standing behind every container, and on a standard install it runs as root, the all-powerful system user. Anyone who can send commands to it can effectively act as root on the machine, which is why adding a user to the docker group is treated as giving them root access. Docker does offer a rootless mode, but it is extra setup, not the default.
Podman: no daemon in the middle
Podman has no daemon. When you run podman run, the podman process starts the container itself, and a tiny helper process stays behind to watch over it. There is no always-on service waiting for commands.
Here is the difference at a glance:
That can feel simpler, and sometimes it is safer. There is no single privileged service for an attacker to target, and each container is an ordinary process owned by whoever started it.
Rootless by design
Podman was built to run rootless: an ordinary user can run containers without becoming root. Inside the container, the app can still see itself as root, but Linux user namespaces map that 'root' to your own unprivileged user on the host. If the app breaks out of the container, it lands as you, not as root.
A worked example
The commands are deliberately familiar. Running a web server looks the same in both:
docker run -d --name web -p 8080:80 nginx
podman run -d --name web -p 8080:80 nginxMany people switch with a single alias, and most scripts keep working:
alias docker=podmanYou can see the rootless mapping for yourself. As a normal user, start the container with Podman and ask which user each process runs as, inside the container and on the host:
podman top web user huserUSER HUSER
root 1000Inside, nginx thinks it is root. On the host, HUSER shows the same process is really your own user, here with the user ID 1000. That is the safety net rootless containers give you.
Where they differ in practice
- Short image names. Docker assumes Docker Hub when you write
nginx. Podman may ask which registry you mean, or need the full name,docker.io/library/nginx. - Low ports. Rootless containers can't usually bind to ports below 1024 on the host, so map to a port such as 8080.
- Starting on boot. Docker's daemon can restart containers itself. Podman leaves that to the system, usually systemd.
- Multi-container apps. Docker has Docker Compose. Podman can run most Compose files too, and also groups containers into pods, an idea borrowed from Kubernetes.
Which should you use?
The two cover the same ground, so the choice is about the trade-offs around them.
| Docker | Podman | |
|---|---|---|
| Background daemon | Yes | No |
| Rootless | Optional extra | Built in |
| Ecosystem | Largest | Smaller, growing |
Pick Docker if you want the most common container tool. It has stronger momentum, more tools, more examples and more tutorials, and it is what most teams already use. When something goes wrong, someone has almost certainly written about it.
Pick Podman if you want daemonless, rootless-friendly containers: on shared servers, in CI runners where you don't want a root daemon, or anywhere security matters more than following the crowd. It is also the default container tool on Red Hat-family Linux systems such as Fedora.
Because both follow the same image standard, the choice isn't permanent. Plenty of teams build images with one tool and run them with the other.
Common mistakes
- Assuming the alias covers everything. Day-to-day commands match, but networking, volume permissions and tools that talk to Docker's socket can behave differently. Test before you switch a whole pipeline.
- Thinking rootless means perfectly safe. It reduces the damage of a break-out; it doesn't fix a vulnerable app or a leaked secret.
- Handing out the
dockergroup casually. Membership gives root-level control of the machine. Treat it like an admin password. - Running the app as root inside the image anyway. Whichever tool you use, a non-root user in the image is still a good habit.
Key takeaways
- Docker and Podman both build images and run containers, and their commands are nearly the same.
- Docker usually works through a daemon: a background service, always running, doing the container work.
- Podman has no daemon and is built for rootless containers, which is nice for security.
- Docker has the bigger ecosystem, more tools and more examples.
- Both use the same image standard, so images move freely between them.