| Tested on | Red Hat Enterprise Linux 10.2 (Coughlan) |
|---|---|
| Package | podman-5.8.2-5.el10_2.x86_64 |
| Applies to | Any Linux host with Podman installed |
| Privilege | Normal user or root (hello-world example uses rootful Podman on the lab host) |
| Scope | Conceptual introduction — what Podman is, the problem it solves, daemonless and rootless models, ecosystem tools, a short Docker comparison, one hello-world run, and when to use Podman. Does not cover install steps, architecture internals, rootless UID mapping, or command reference depth. |
Quick answer: what is Podman?
Podman is an open-source OCI container engine for Linux. You use it to run application workloads inside containers — isolated processes that share the host kernel but carry their own filesystem, users, and network view.
Podman manages the pieces you touch day to day:
- container images and local image storage
- running and stopped containers
- pods — groups of containers that share selected namespaces; by default Podman pods share IPC, network, and UTS namespaces
- networks and volumes
- registry login, pull, and push
- image builds from a Containerfile or Dockerfile
For normal local work, Podman does not rely on one continuously running central manager daemon. When you run podman run, the podman command you started coordinates the operation and exits; your container can keep running in the background. Most Podman workflows also support rootless operation, so a regular login user can own containers without root privileges.
Under the hood, Podman hands off to an OCI runtime such as crun or runc to create and start the container process. That distinction matters: Podman is the engine, not the low-level runtime. The runtime applies Linux kernel isolation; Podman decides what image to run, how to wire storage and networking, and when to start or stop the workload.
Linux is the native home for the workflows in this article. Podman Desktop and remote clients exist, but the engine's sweet spot is servers, CI runners, and developer workstations running Linux. This is the opening lesson in the Podman tutorial — install, architecture, and command depth live in linked chapters. When pulls, rootless setup, or networking misbehave, the Podman troubleshooting chapter maps log lines to fixes.
What problem does Podman solve?
Developers want the same application to run the same way on a laptop, in CI, and on a production host. Containers package the app plus its dependencies into an OCI image — a portable filesystem template with a default command.
Application + dependencies
↓
OCI container image
↓
Podman
↓
Linux containerA Linux container is not a full virtual machine. It is one or more processes on the host, wrapped in kernel features (namespaces and cgroups) so the process believes it has its own root filesystem, process tree, and network stack. Podman is the tool that turns an image into that running process and keeps track of it until you remove it.
Podman gives you commands for the full single-host lifecycle:
- pull images from a registry or load them from a tar archive
- create and start containers, then stop or remove them
- attach networks and publish ports
- mount volumes or bind host directories for persistent data
- group related containers into pods
- build new images with
podman build - log in to registries and push images you built
This article is not a general "what are containers?" course. It assumes you have heard of images and registries and want to know where Podman fits.
How does Podman work?
Think of Podman as a coordinator between you, local storage, and the kernel:
podman CLI
↓
Podman / libpod
↓
OCI runtime such as crun
↓
Linux kernel isolation
↓
Container processWhen you type a Podman command, the CLI initiates the requested operation. Podman (through the libpod library) resolves the image, prepares container configuration, sets up storage and network attachments, and asks an OCI runtime to start the workload. The result is an ordinary Linux process — isolated, but still on the same kernel as the host.
Podman also starts a per-container monitor such as conmon to watch the main process, forward logs, and handle attach operations. That helper is not the same thing as a cluster-wide dockerd; it exists for one container at a time.
Process trees, storage paths, cgroup layout, and Netavark DNS belong in Podman architecture. Here the takeaway is simpler: CLI → engine → runtime → kernel → your app.
Why is Podman called daemonless?
Search results and forum threads often lead with "daemonless" because it contrasts with classic Docker Engine, where a long-lived dockerd process owns container state and serves a socket API.
Podman's local model works differently:
- A
podman runcommand does not need to submit every step through an always-on manager daemon equivalent todockerd. - After Podman creates a detached container, the container keeps running when the CLI process exits.
- Each user can run Podman without sharing one root-owned daemon socket.
- Podman can optionally expose a Docker-compatible API using
podman system serviceor apodman.socketunit when remote clients need it.
"Daemonless" does not mean Podman never runs background or service processes. You may still see short-lived helpers per container, optional API listeners, and systemd-managed units generated by Quadlet. The point is that normal day-to-day container work does not depend on one central daemon the way traditional Docker Engine does.
Docker comparison in one sentence: Docker's client often talks to dockerd; Podman's CLI does the coordination itself for local operations. For tables, socket security, and migration notes, read Podman vs Docker.
What can you do with Podman?
| Task | Podman capability |
|---|---|
| Run containers | podman run |
| Manage images | podman pull, images, rmi |
| Build images | podman build |
| Group containers | Pods |
| Persistent storage | Volumes and bind mounts |
| Networking | Podman networks |
| Rootless containers | Run without root |
| systemd integration | Quadlet |
| Kubernetes YAML | podman kube |
| Registries | login, pull, and push |
| Docker-compatible API | Podman API / socket |
You do not need every row on day one. Most people start with pull, run, and ps, then add volumes, ports, and Compose or Quadlet when they deploy services for real. Command-by-command coverage is in Podman commands and Run containers with podman run.
Run your first Podman container
The Podman project publishes a tiny hello image that prints a greeting and exits. It is a safe first run because the workload finishes on its own.
Use --rm so Podman deletes the container record after the process exits:
podman run --rm quay.io/podman/helloSample output:
!... Hello Podman World ...!
.--"--.
/ - - \
/ (O) (O) \
~~~| -=(,Y,)=- |
.---. /` \ |~~
~/ o o \~~~~.----. ~~
| =(X)= |~ / (O (O) \
~~~~~~~ ~| =(Y_)=- |
~~~~ ~~~| U |~~Here is what happened behind that greeting:
- Podman checked local image storage for
quay.io/podman/hello. - If the image was missing, Podman pulled it from the registry.
- Podman created a container with the image's default command.
- An OCI runtime (on this host,
crun) started the container process. --rmremoved the container when the process exited.
That is the whole lifecycle in miniature. Flags for detach mode, names, ports, and environment variables are covered in Run containers with podman run — not here.
Rootless vs rootful Podman
| Rootful Podman | Rootless Podman | |
|---|---|---|
Who runs podman |
root (UID 0) | Normal login user |
| Typical use | Admin-managed servers, legacy scripts | Developer laptops, shared hosts, per-user isolation |
| Storage location | System paths such as /var/lib/containers |
User-owned storage, typically ~/.local/share/containers/storage by default |
| Privileged ports (<1024) | Available without extra setup | Often needs sysctl or a reverse proxy |
| Separate state | Yes — rootful and rootless do not share the same container list |
Rootless Podman maps container users through Linux user namespaces and subordinate UID/GID ranges so an unprivileged account can create containers safely. Some operations still need root or behave differently rootless — binding low ports, certain device mounts, and host directory permissions are common stumbling blocks.
The lab hello-world command ran as rootful Podman (rootless=false in podman info). On your workstation you may run the same image as an ordinary user once rootless is configured.
Do not dive into /etc/subuid, keep-id, or auto here. Those topics live in rootless Podman, rootless vs rootful Podman, and Podman user namespaces.
Podman, Buildah, Skopeo, and CRI-O
The containers ecosystem ships several tools that share libraries but target different jobs:
| Tool | Role |
|---|---|
| Podman | Run and manage containers, pods, images, networks, and volumes on a host |
| Buildah | Build OCI images without a daemon (podman build uses Buildah internally) |
| Skopeo | Inspect, copy, and sync images between registries and local storage |
| CRI-O | Kubernetes-focused CRI runtime stack — kubelet talks to CRI-O, not Podman directly |
You can install only podman and never invoke these tools directly. podman build uses Buildah code internally, while Podman and Skopeo share the containers/image library for image and registry operations. CRI-O serves a different role as a Kubernetes CRI runtime.
Podman vs Docker: the short version
| Topic | Docker Engine (typical) | Podman |
|---|---|---|
| Daemon model | Long-lived dockerd |
No central daemon for local CLI work |
| Rootless | Supported with separate setup | First-class for many workflows |
| Pods | Not a first-class object | Native podman pod |
| Compose | docker compose plugin common |
podman compose delegates to an external provider |
| systemd | Custom units or compose stack | Quadlet generates native units |
| Docker-compatible API | Native socket | Optional via podman system service |
Podman is often described as a Docker alternative because the CLI feels familiar. That comparison helps you get started, but it is not the full definition — Podman's daemonless and rootless design stands on its own merits on Linux servers.
Feature-by-feature depth, compose providers, and migration checklists are in Podman vs Docker.
When should you use Podman?
Podman is a strong fit when you want:
- container workloads on Linux servers without maintaining
dockerd - rootless containers per developer or service account
- systemd-managed services through Quadlet instead of hand-written restart scripts
- Kubernetes-style pods on one machine for learning or edge layouts
- Docker-compatible CLI habits while standardizing on Podman in CI
- image build and registry workflows in automation pipelines
Consider something else when:
- your team depends on Docker Desktop integrations on macOS or Windows and is not ready to change local tooling
- applications assume Docker-only plugins, Swarm, or proprietary Desktop features
- you need multi-node orchestration, declarative rollouts, and cluster APIs — use Kubernetes or OpenShift
- you only need a Kubernetes node runtime — the kubelet may use CRI-O or containerd rather than Podman
Many teams run Podman in production on Linux while developers keep Docker Desktop locally until pipelines catch up. Images stay portable because both tools speak OCI.
What to read next
If you are new to the course, continue in this order:
- Install Podman on RHEL — AppStream packages on RHEL 8, 9, and 10; see also Ubuntu, Debian, and Rocky Linux
- Podman architecture — how
conmon,crun, and networking fit together - Run containers with podman run — names, detach, ports, and cleanup
The Podman tutorial hub lists every chapter, including networking, volumes, rootless depth, and Quadlet.
References
Summary
Podman is an open-source OCI container engine for Linux. It pulls and builds images, runs containers and pods, wires networks and volumes, and talks to registries — without requiring a continuously running central manager daemon for everyday local commands. An OCI runtime such as crun actually starts the isolated process; Podman coordinates everything around that runtime.
The daemonless model means podman run can finish while the container keeps running, and rootless mode lets normal users own their own container state. Helper processes such as conmon exist per container, and an optional API socket serves remote clients — so "daemonless" describes the absence of a dockerd-style broker, not zero background activity.
You ran one hello-world image to see the lifecycle: check storage, pull if needed, create the container, start it through the runtime, then remove it with --rm. Rootful and rootless differ in privileges, storage paths, and a few capabilities; Podman uses Buildah internally for builds and shares the containers/image library with Skopeo, while CRI-O serves Kubernetes nodes as a CRI runtime.
Use Podman for Linux server workloads, rootless workflows, systemd integration, and Docker-familiar CLIs. Reach for Kubernetes or OpenShift when you need fleet orchestration, and read Podman vs Docker when migration comparisons matter. Install and daily commands come next in Install Podman on RHEL, Ubuntu, Debian, or Rocky Linux and Run containers with podman run.

