Introduction

If you work with containers, you probably know Docker. But in recent years, an interesting competitor has emerged: Podman. Developed by Red Hat, Podman promises to do everything Docker does, but differently and, according to some, better.

In this article, we’ll analyze the real differences between the two, without fanaticism, to help you understand which tool is right for you.

What is Podman?

Podman (Pod Manager) is a tool for managing containers and pods, developed by Red Hat as an open source alternative to Docker. Its main feature? It doesn’t need a daemon running.

The name “Podman” comes from the concept of “pod”, the same used in Kubernetes: a group of containers that share resources.

The Fundamental Difference: Daemon vs Daemonless

Docker: Client-Server Architecture

Docker works with a daemon (dockerd) always running in the background:

1
2
3
4
β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”     β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”     β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚ Docker CLI   β”‚ ──► β”‚ Docker Daemonβ”‚ ──► β”‚  Container   β”‚
β”‚ (client)     β”‚     β”‚ (dockerd)    β”‚     β”‚              β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜     β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜     β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜
  • The daemon runs as root
  • All commands go through the daemon
  • If the daemon crashes, you lose access to containers

Podman: Fork-Exec Architecture

Podman has no daemon. Each command directly creates the container process:

1
2
3
4
β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”     β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚ Podman CLI   β”‚ ──► β”‚  Container   β”‚
β”‚              β”‚     β”‚              β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜     β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜
  • No background process
  • Containers are direct children of the Podman command
  • Each user manages their own containers

Detailed Comparison

1. Security: Rootless by Default

Docker:

  • The daemon traditionally runs as root
  • Rootless mode available but not default
  • An exploit in the daemon = root access to the system

Podman:

  • Rootless by default
  • Each user has their own isolated containers
  • No privileged daemon to attack
1
2
3
4
5
# Podman: containers without root privileges
podman run -it alpine sh

# Docker: requires docker group or sudo (traditionally)
sudo docker run -it alpine sh

Security winner: Podman

2. Command Compatibility

Good news: the syntax is almost identical.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
# Docker
docker run -d -p 8080:80 nginx
docker ps
docker images
docker build -t my-app .

# Podman (same commands!)
podman run -d -p 8080:80 nginx
podman ps
podman images
podman build -t my-app .

You can create an alias for a painless transition:

1
alias docker=podman

Compatibility: Almost total for daily use

3. Docker Compose vs Podman Compose

Docker Compose is the de facto standard for orchestrating multiple containers in development.

Podman offers two options:

  1. podman-compose: Python reimplementation
  2. podman compose: integrated in recent versions (uses Compose spec)
1
2
3
4
5
# With recent Podman
podman compose up -d

# With podman-compose (separate installation)
podman-compose up -d

Note: Compatibility is good but not perfect. Some docker-compose.yml files might require small adjustments.

4. Image Management

Both use the same image format (OCI), so you can:

  • Use the same images from Docker Hub
  • Build images with the same Dockerfile
  • Transfer images between Docker and Podman
1
2
3
4
5
6
7
8
# Podman can use Docker Hub images
podman pull docker.io/library/nginx

# Save an image
podman save -o nginx.tar nginx

# Load it in Docker
docker load -i nginx.tar

5. Pods: A Podman Exclusive Feature

Podman natively supports pods, groups of containers that share network namespace:

1
2
3
4
5
6
7
8
# Create a pod
podman pod create --name my-pod -p 8080:80

# Add containers to the pod
podman run -d --pod my-pod nginx
podman run -d --pod my-pod redis

# Containers in the pod communicate via localhost

This is useful for:

  • Simulating Kubernetes pods locally
  • Grouping related containers
  • Simplifying communication between services

Docker doesn’t have a direct equivalent (it uses networks).

6. Systemd Integration

Podman integrates natively with systemd, the Linux init system:

1
2
3
4
5
# Generate a systemd service file from a container
podman generate systemd --name my-container > my-container.service

# Enable the container at system startup
systemctl --user enable my-container.service

This allows managing containers as normal system services, without needing a separate daemon.

7. Performance

Performance is comparable in most cases:

AspectDockerPodman
Container startupSlightly fasterSlightly slower
Base memory~50-100 MB (daemon)~0 MB (no daemon)
Image buildsFast (BuildKit)Comparable
Disk I/OExcellentExcellent

The difference is negligible for most uses.

Summary Table

FeatureDockerPodman
DaemonYesNo
Rootless defaultNoYes
Command compatibility-99%
Docker ComposeNativeVia podman-compose
Native podsNoYes
Systemd integrationLimitedNative
Kubernetes supportDocker DesktopNative
Desktop GUIDocker DesktopPodman Desktop
PlatformsLinux, Win, MacLinux, Win, Mac
LicenseApache 2.0Apache 2.0

When to Choose Docker

Docker remains the best choice if:

  • You work in a team that already uses Docker
  • You need Docker Compose with perfect compatibility
  • You use Docker Desktop and its features (integrated Kubernetes, extensions)
  • You follow tutorials and documentation (almost all use Docker)
  • You need commercial support

When to Choose Podman

Podman is preferable if:

  • Security is a priority (enterprise environments, production)
  • You work on RHEL, CentOS, Fedora (native integration)
  • You want rootless containers without extra configuration
  • You need to manage containers as systemd services
  • You’re learning Kubernetes (pods are an advantage)
  • You don’t want a daemon always running

Migrating from Docker to Podman

If you want to try Podman while maintaining compatibility:

1. Install Podman

1
2
3
4
5
6
7
8
# Fedora/RHEL
sudo dnf install podman

# Ubuntu/Debian
sudo apt install podman

# Mac (with Homebrew)
brew install podman

2. Create the Alias

1
2
# In your .bashrc or .zshrc
alias docker=podman

3. Test Your Workflows

Most commands will work identically. Verify:

  • Image builds
  • Docker Compose (use podman compose or podman-compose)
  • Volumes and networks

4. Resolve Incompatibilities

The most common:

  • Some Docker-specific flags don’t exist
  • The Docker socket (/var/run/docker.sock) doesn’t exist by default
  • Some CI/CD integrations might require adjustments

Can They Coexist?

Yes! Docker and Podman can coexist on the same system. They use separate storage, so containers and images aren’t shared, but you can use both for different purposes.

Conclusions

There’s no absolute winner. The choice depends on context:

  • Docker remains the de facto standard, with the most mature ecosystem and abundant documentation
  • Podman offers concrete advantages in terms of security and architecture, especially in enterprise environments

My advice? If you’re starting from scratch, try both. Command compatibility makes switching painless. If you’re already in a consolidated Docker ecosystem, there’s no urgency to migrate, but it’s worth keeping an eye on Podman for future projects.

The nice thing? Whatever you learn with one applies almost completely to the other.