Podman is an open-source container engine that enables users to create, manage, and run OCI containers and pods across Linux, macOS, and Windows. Unlike Docker, Podman is daemonless, running containers directly under the user's control, which brings unique benefits in security and flexibility.

Image description

Advantages of Podman

Daemonless Operation

Podman does not require a central background service. Each container runs as a child process of the user, reducing resource overhead and improving security by eliminating a single point of failure.

Rootless Containers

Podman supports running containers without root privileges. This greatly reduces the risk of privilege escalation and is ideal for multi-user systems or environments with strict security requirements.

Docker Compatibility

Podman’s command-line interface is largely compatible with Docker, allowing most Docker commands and workflows to be used without modification. It can build and run containers from Dockerfiles and work with Docker images.

Pods and Kubernetes Integration

Podman natively supports pods, which are groups of containers sharing resources, similar to Kubernetes. This makes it easier to transition workloads to Kubernetes environments.

Systemd Integration

Podman can generate systemd unit files for containers and pods, making it easy to manage container lifecycles and ensure containers start automatically on system boot.

Performance

Without a central daemon, Podman typically consumes fewer resources and starts containers faster, especially in environments with many containers or limited resources.


Disadvantages of Podman

Learning Curve

Podman introduces concepts like rootless mode, custom storage, and networking configurations that may require extra learning, especially for users transitioning from Docker.

Smaller Ecosystem

Podman’s ecosystem and third-party integrations are not as extensive as Docker’s, which can make finding solutions or integrating with other tools more challenging.

Networking Limitations

Some advanced networking features are less mature or require more manual setup compared to Docker, particularly for complex routing or load balancing scenarios.

Feature Maturity

Features like orchestration and high availability are still evolving in Podman and may require additional tools or manual configuration.


Podman Installation and Setup

Linux

Debian/Ubuntu:

sudo apt update && sudo apt upgrade -y
sudo apt install -y podman
podman --version

CentOS/RHEL:

sudo yum -y install podman
podman --version

macOS

Using Homebrew:

brew install podman
podman machine init
podman machine start
podman info

Alternatively, you can download the official installer from the Podman website or use Podman Desktop for a GUI-based experience. After installation, initialize and start a Podman machine, as containers on macOS run inside a lightweight virtual machine.

Podman Desktop (GUI):

  • Download the .dmg file from the Podman Desktop website.
  • Drag the Podman Desktop icon to the Applications folder.
  • Launch Podman Desktop and follow the prompts to install the Podman engine if needed.

Windows

  • Download the Podman installer from the official Podman website or GitHub releases.
  • Run the installer and follow the prompts.
  • Podman uses Windows Subsystem for Linux (WSLv2) to run containers.
  • After installation, initialize and start Podman using Podman Desktop or with:
podman machine init
  podman machine start
  podman info
  • You can use Podman from PowerShell, CMD, or directly within the WSL environment.

Podman Basic Configuration and Settings

Podman’s behavior can be customized using configuration files and environment variables:

Key Configuration Files:

  • containers.conf: Sets engine-wide defaults (runtime, network, resource limits).
  • storage.conf: Configures storage drivers and options.
  • registries.conf: Lists container registries for pulling/pushing images.
  • policy.json: Manages image signature verification policies.

Common Environment Variables:

  • CONTAINERS_CONF: Path to containers.conf.
  • CONTAINERS_REGISTRIES_CONF: Path to registries.conf.
  • CONTAINERS_STORAGE_CONF: Path to storage.conf.
  • CONTAINER_HOST: URL for remote Podman service (e.g., unix:///run/user/$UID/podman/podman.sock).
  • TMPDIR: Directory for temporary image storage.
  • XDG_CONFIG_HOME, XDG_DATA_HOME, XDG_RUNTIME_DIR: Control where configuration, image storage, and runtime data are stored, especially in rootless mode.

Example: Creating and Managing Pods

Create an empty pod:

podman pod create --name demo-pod

List pods:

podman pod ls

List containers in a pod:

podman ps -a --pod

Add a container to a pod:

podman run -dt --pod demo-pod nginx

Summary Table: Podman vs Docker

Feature Podman Docker
Architecture Daemonless Central daemon required
Rootless Mode Yes Limited
CLI Compatibility Docker-compatible Standard
Systemd Integration Native Requires workarounds
Pod/Kubernetes Support Native pods, easy Kubernetes integration Requires additional tools
Security Enhanced (rootless, user auditing) Higher attack surface
Ecosystem Growing, less mature Large, mature
Performance Lightweight, fast startup Slightly higher overhead
Tooling Fewer third-party tools Extensive tooling

Conclusion

Podman is a powerful alternative to Docker, offering improved security, rootless operation, and native pod support. While its ecosystem is still growing and some advanced features are maturing, it is a strong choice for developers and administrators seeking a secure, flexible, and modern container engine. Installation is straightforward on all major platforms, with both CLI and GUI options available. Configuration is highly customizable, allowing Podman to fit a wide range of use cases.