I ditched Docker for Podman

A developer's perspective on switching from Docker to Podman, exploring containerization alternatives and deployment strategies.

Why I Switched from Docker to Podman

Docker’s dominance in containerization comes with significant security and architectural trade-offs. After years of using Docker, I made the switch to Podman and discovered a more secure, efficient alternative that solves many of Docker’s fundamental problems.

Docker’s Security Problem

Docker runs as a privileged daemon with root access to your entire system. This creates a massive attack surface where any vulnerability in the Docker daemon can compromise your entire host. The daemon architecture means a single point of failure controls all your containers.

Recent CVEs demonstrate this risk. When Docker’s daemon gets compromised, attackers gain root access to the host system. This isn’t theoretical—it’s a documented security concern that affects production systems worldwide.

Podman’s Daemonless Architecture

Podman eliminates the daemon entirely. Each container runs as a separate process under your user account, not as a privileged system service. This fundamental difference means:

  • No root daemon: Containers run with your user privileges, not system-wide root access
  • Process isolation: Each container is an independent process you can manage directly
  • Reduced attack surface: No central daemon to compromise

Even if someone escalates privileges inside a Podman container to root level, they’re still just an unprivileged user on the actual host system.

Seamless Migration

The transition requires minimal effort. Podman’s CLI mirrors Docker’s exactly:

1
2
3
4
5
# Instead of this
docker run -it ubuntu bash

# You run this
podman run -it ubuntu bash

Most developers can simply alias docker=podman and continue their existing workflows. The command syntax, flags, and behavior remain identical for standard operations.

Systemd Integration

Podman integrates natively with systemd, enabling proper service management without external orchestration:

1
2
3
4
5
# Generate systemd service files
podman generate systemd --new --name myapp

# Enable automatic startup
systemctl --user enable myapp.service

This integration means containers start automatically on boot, restart on failure, and integrate with system logging—all without additional tools.

Kubernetes Compatibility

Podman generates Kubernetes YAML directly from running containers:

1
2
podman generate kube myapp > myapp.yaml
kubectl apply -f myapp.yaml

This creates a smooth migration path from local development to Kubernetes deployment using the same configuration.

Compose Alternative

While Podman supports docker-compose through compatibility layers, it encourages better practices. Convert complex compose files to Kubernetes YAML for more standardized orchestration, or use Podman’s native pod functionality for simpler multi-container applications.

Performance Benefits

Without a daemon consuming system resources, Podman uses less memory and CPU. Container startup is faster since there’s no daemon communication overhead. The daemonless architecture also eliminates daemon crashes that can affect all running containers.

Rootless by Default

Podman runs rootless containers by default, following the principle of least privilege. This means:

  • Containers can’t bind to privileged ports (use a reverse proxy instead)
  • File permissions work correctly with your user account
  • No sudo required for container operations

Migration Considerations

Some Docker-specific features require adjustment:

  • Privileged ports: Use a reverse proxy like nginx or traefik
  • Docker Compose: Use podman-compose or convert to Kubernetes YAML
  • Build contexts: Podman handles builds slightly differently but supports the same Dockerfile syntax

Getting Started

Install Podman through your system’s package manager:

1
2
3
4
5
6
7
8
# Ubuntu/Debian
sudo apt install podman

# Fedora
sudo dnf install podman

# macOS
brew install podman

Start with simple containers to verify compatibility, then gradually migrate more complex workloads.

The Bottom Line

Podman offers the same containerization benefits as Docker while eliminating the security risks of a privileged daemon. The migration is straightforward, and the improved security posture makes it worthwhile for any team serious about container security.

The container ecosystem has matured beyond Docker’s early architectural decisions. Podman represents the next generation of container tools—more secure, more efficient, and better integrated with modern Linux systems.