
Docker has been the default container tool since 2013. Almost every tutorial, CI/CD pipeline, and cloud platform was built around it.
That is changing. Podman has captured 23% of the enterprise container runtime market in 2026, up from just 8% in 2023. According to the Stack Overflow Developer Survey 2025, 67% of developers still use Docker — but 19% now use Podman, and that number is growing.
This post covers what actually separates the two tools, with real commands, real performance numbers, and real-world scenarios — so you can make the right call for your environment.
Why Are Teams Looking at Podman Now?
Three things happened that pushed teams to reconsider Docker:
1. Docker Desktop licensing changed. In 2022, Docker made Docker Desktop a paid product for companies with more than 250 employees or more than $10 million in revenue. For large teams on macOS or Windows, this translates to $50,000–$120,000 per year. Podman Desktop is completely free with no licensing restrictions.
2. Kubernetes removed Docker as a runtime. Kubernetes dropped dockershim support in version 1.24 (May 2022). Docker containers still work in Kubernetes — but through containerd, not Docker directly. This sent a clear signal that Docker is no longer the preferred runtime for Kubernetes.
3. Security teams started blocking Docker’s root daemon. The dockerd daemon runs as root. Adding a user to the docker group on Linux is functionally equivalent to giving them root access to the host. Security audits started flagging this. Podman’s rootless design fixed this problem cleanly.
What Is Docker?
Docker uses a client-server architecture. The Docker CLI sends commands to dockerd — a daemon that runs as a background service with root privileges. That daemon manages everything: containers, images, networks, and volumes.
You → docker CLI → dockerd (root daemon) → container processes
The daemon is always running, even when no containers are active. It uses 140–180MB of memory at idle.
If dockerd crashes, every container it manages goes down. In December 2025, a real incident was documented where Docker 27.4.0’s dockerd process grew from a few hundred MB to 8GB over several days, eventually bringing the server down. This is a known risk with daemon-based architectures.
Docker Hub had a major outage in October 2025 when AWS US-East-1 went down. Teams that depended on Docker Hub for base images found their entire CI/CD pipelines broken — even for builds that should have used cached images, because dockerd was still making HEAD requests to the registry.
What Is Podman?
Podman stands for Pod Manager. It was developed by Red Hat and is the default container engine in Red Hat Enterprise Linux 8 and later.
Podman has no daemon. Each container runs as a direct child process of the user who started it.
You → podman CLI → container process (runs as your user)
No background service. No privileged socket. No single point of failure.
Podman has been production-ready since version 2.0 in 2020. The current version is 5.x. Red Hat, IBM, and U.S. government agencies use it in production. The U.S. Department of Defense mandates Podman for classified workloads because of the rootless requirement.
Architecture — The Core Difference
This is where everything else comes from.
Docker:
The dockerd daemon sits between you and your containers. All container operations go through it. If it fails, everything fails. Because it runs as root, a compromised daemon gives an attacker root access to the entire host.
Podman:
Each podman run command forks a container directly as a child process. There is no central service. If one container crashes, others keep running. The attack surface is dramatically smaller.
This architectural difference explains every other difference between the two tools.
CLI — The Commands Are Almost Identical
Podman was designed to be a drop-in replacement for Docker. Most commands are identical:
Run a container:
# Docker
docker run -d --name nginx -p 8080:80 nginx
# Podman
podman run -d --name nginx -p 8080:80 nginx
Build an image:
# Docker
docker build -t myapp:1.0 .
# Podman
podman build -t myapp:1.0 .
List containers:
docker ps
podman ps
View logs:
docker logs nginx
podman logs nginx
Execute a command inside a container:
docker exec -it nginx bash
podman exec -it nginx bash
Stop and remove:
docker stop nginx && docker rm nginx
podman stop nginx && podman rm nginx
Teams migrating from Docker to Podman typically set up an alias first:
alias docker=podman
This lets them test Podman without changing any existing scripts or muscle memory.
Security — Where Podman Has a Clear Advantage
Docker’s security model:
dockerddaemon runs as root- All users who run Docker commands need access to the Docker socket
- Being in the
dockergroup is functionally equivalent to having sudo access - If a container escapes, it potentially has root on the host
- Docker containers are launched with 14 kernel capabilities by default
Podman’s security model:
- Containers run as the user who launched them — no root required
- No shared socket — each user manages their own containers
- Rootless by default, not as an afterthought
- If a container escapes, the attacker only has the privileges of that user
- Podman containers are launched with 11 kernel capabilities by default
Real-world scenario:
You have a shared CI/CD server. Multiple developers need to run containers to test their builds.
With Docker, you add them all to the docker group. Now they all have effective root access to the server. One compromised account compromises the entire machine.
With Podman, each developer runs containers under their own user account. No group membership needed. No elevated privileges. A compromised account cannot affect other users or the host system.
# Podman — run a container as a regular user, no sudo
podman run -d --name test-app -p 3000:3000 myapp:latest
# Check who owns the process
ps aux | grep test-app
# Shows: youruser 12345 ... podman run ...
Performance — Real Numbers
Both tools produce identical container runtime performance because they use the same underlying OCI runtime. The differences are in overhead and resource usage.
Idle memory usage:
| Tool | Daemon memory at idle |
|---|---|
| Docker | 140–180MB (daemon always running) |
| Podman | 0MB (no daemon) |
Container startup time:
Research from 2026 shows Podman starts containers in approximately 0.8 seconds versus Docker’s 1.2 seconds. This is because Docker has to communicate with the daemon first.
CI/CD pipeline impact:
In high-frequency CI/CD environments where hundreds of containers start and stop daily, Podman’s faster startup compounds. Teams have reported 30–35% shorter pipeline runtimes after switching from Docker to Podman.
Concurrent containers:
Docker’s daemon becomes a bottleneck at high container counts. Podman handles 100+ concurrent containers with linear performance because there is no central service being hit by every operation.
One important caveat: Docker is marginally faster for individual container starts when the daemon is already warm. If you are running one or two containers at a time on a developer laptop, the difference is negligible.
Pods — A Feature Unique to Podman
Podman supports pods natively. A pod is a group of containers that share the same network namespace — exactly like a Kubernetes pod.
This is useful when developing applications that will run on Kubernetes. You can test your exact pod configuration locally before deploying to a cluster.
Create a pod with a web server and a database:
# Create the pod
podman pod create --name webapp --publish 8080:80
# Add containers to the pod
podman run --pod webapp -d --name web nginx
podman run --pod webapp -d --name db postgres:15
# List the pod
podman pod ps
# Stop the whole pod
podman pod stop webapp
Generate Kubernetes YAML directly from a running pod:
podman generate kube webapp > webapp-k8s.yaml
This YAML can be applied directly to a Kubernetes cluster without modification. Docker has no equivalent for this.
Deploy a Kubernetes manifest locally with Podman:
podman play kube webapp-k8s.yaml
This closes the gap between local development and Kubernetes production.
Systemd Integration
Podman integrates natively with systemd. You can manage containers as system services — they start on boot, restart on failure, and log to journald like any other service.
Generate a systemd service file for a container:
# Generate the service file
podman generate systemd --name webapp --files --new
# Enable it as a user service
systemctl --user enable container-webapp.service
systemctl --user start container-webapp.service
# Check status
systemctl --user status container-webapp.service
With Docker, running containers as systemd services requires writing custom unit files that call docker run. Podman does this automatically.
Docker Compose vs Podman Compose
Docker Compose is now built into the Docker CLI as docker compose (v2). It is mature, well-tested, and supported by virtually all CI/CD tools.
Podman Compose is a separate Python package that replicates Docker Compose functionality. Most standard docker-compose.yml files work without changes.
# Install podman-compose
pip3 install podman-compose
# Use it exactly like docker-compose
podman-compose up -d
podman-compose down
podman-compose logs
Where podman-compose has gaps:
- Docker Swarm mode — Podman does not support this. If you use Docker Swarm, migrating to Podman requires switching to Kubernetes first.
- Custom Docker plugins — not all Docker-specific extensions work
- Some advanced networking configurations need adjustment
For standard web application stacks (nginx, postgres, redis, app server), podman-compose works without changes.
CI/CD Pipelines
Docker works out of the box with GitHub Actions, GitLab CI, Jenkins, and CircleCI. Runners come pre-configured with Docker.
Podman in CI requires more setup but enables a security improvement that matters: you can build images in rootless mode without a privileged Docker daemon.
The traditional “Docker-in-Docker” approach in CI requires running the Docker daemon inside the CI container with privileged mode enabled. This is a known security risk — privileged containers have near-full access to the host.
With Podman, you build images rootless inside CI containers without privileged mode.
GitHub Actions with Podman:
name: Build with Podman
on: [push]
jobs:
build:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Install Podman
run: sudo apt-get install -y podman
- name: Build image
run: podman build -t myapp:${{ github.sha }} .
- name: Push to registry
run: |
podman login ghcr.io -u ${{ github.actor }} -p ${{ secrets.GITHUB_TOKEN }}
podman push myapp:${{ github.sha }} ghcr.io/${{ github.repository }}/myapp:${{ github.sha }}
Real-world example from the industry:
A SaaS company running GitLab CI switched from Docker-in-Docker (which required privileged CI containers) to Podman running rootless. This removed the need for privileged mode entirely, passed security audits that had been blocking them, and reduced pipeline build times by around 30%.
Image Compatibility
Both tools use the OCI image format. An image built with Docker runs on Podman and vice versa without conversion.
# Build with Docker, run with Podman
docker build -t myapp:latest .
podman run myapp:latest
# Build with Podman, push to Docker Hub
podman build -t myapp:latest .
podman push docker.io/yourusername/myapp:latest
Registry authentication — one difference to watch:
Podman stores registry credentials in $HOME/.config/containers/auth.json instead of Docker’s $HOME/.docker/config.json. When migrating CI pipelines, update credential paths accordingly.
Licensing — The Cost Difference
Docker Desktop:
Free for personal use, education, and companies with fewer than 250 employees and less than $10 million in annual revenue.
For larger organisations, pricing (as of 2026) is:
- Docker Pro: ~$5/month per user
- Docker Team: ~$9/month per user
- Docker Business: ~$24/month per user
A team of 100 developers on Docker Business pays ~$28,800 per year just for the desktop client.
Podman Desktop:
Completely free. Open source. Apache License 2.0. No restrictions for commercial use.
Note: Docker Engine on Linux (not Docker Desktop) remains free for everyone. If your developers work on Linux, this licensing issue does not apply.
Adoption in 2026 — The Numbers
According to the Stack Overflow Developer Survey 2025:
- Docker: 67% developer adoption
- Podman: 19% developer adoption
According to the CNCF Annual Survey 2025:
- 90%+ of organisations use containers in production
- 95% of Kubernetes clusters use containerd as the runtime (not Docker)
- 34% of organisations use more than one container runtime — Docker for dev, Podman in CI, containerd in production
Podman’s market share in enterprise environments grew from 8% in 2023 to 23% in 2026. The growth is concentrated in regulated industries — finance, healthcare, and government — where the rootless security model is a compliance requirement.
Common Migration Issues
Teams switching from Docker to Podman commonly hit three issues:
1. Registry authentication format:
# Docker stores credentials here
~/.docker/config.json
# Podman stores credentials here
~/.config/containers/auth.json
# Log in with Podman
podman login docker.io
2. Bind mount permissions: Rootless Podman maps your user to a different UID inside the container. Files created by the container may appear owned by a different user on the host.
# Fix: use --userns=keep-id to preserve user mapping
podman run --userns=keep-id -v ./data:/app/data myapp
3. Networking differences: Podman’s rootless networking uses slirp4netns or pasta. Port binding below 1024 may require additional configuration on some systems.
# If port 80 binding fails in rootless mode, use a higher port
podman run -p 8080:80 nginx
# Then use a reverse proxy (nginx, caddy) to forward 80 → 8080
Which One Should You Use?
Use Docker if:
- Your team is on Docker and it is working — no reason to change
- You use Docker Swarm for orchestration
- Your CI/CD tooling is tightly integrated with Docker and migration cost is high
- Developers work on macOS/Windows and your company is under the licensing threshold
- You need the broadest possible ecosystem compatibility
Use Podman if:
- You are on RHEL, Fedora, or CentOS — Podman is already installed and it is the supported default
- Security audits require rootless containers or a no-daemon architecture
- You are deploying to Kubernetes or OpenShift — Podman’s pod model reduces the gap between local dev and production
- You want to remove Docker Desktop licensing costs
- You run shared CI/CD servers where giving users Docker group access is a security concern
Use both if: This is what many mature teams actually do. Docker on developer machines for the familiar workflow and ecosystem. Podman in CI and production for security and Kubernetes alignment. The images are compatible so the switch between environments is seamless.
Quick Reference
| Feature | Docker | Podman |
|---|---|---|
| Architecture | Client-server with daemon | Daemonless, fork-exec |
| Runs as root by default | Yes | No |
| Rootless support | Available, not default | Default |
| Idle memory usage | 140–180MB | 0MB |
| Container startup | ~1.2 seconds | ~0.8 seconds |
| Pod support | No | Yes |
| Kubernetes YAML generation | No | Yes (podman generate kube) |
| Systemd integration | Manual | Native |
| Docker CLI compatible | Native | Drop-in (alias docker=podman) |
| Compose | Docker Compose (built-in) | podman-compose (separate package) |
| Docker Swarm | Yes | No |
| Desktop licensing | Paid for large orgs | Free |
| Default in RHEL 8+ | No | Yes |
| Developer adoption (2025) | 67% | 19% |
| Enterprise security use | Standard | Preferred for regulated industries |