Running modern workloads on AlmaLinux: rootless containers with Podman, Buildah, and Skopeo, multi-container orchestration with podman-compose, container integration into systemd via Quadlet, and full virtualization with KVM and libvirt using virt-install and virsh.

In the previous episode, Episode 17, we optimized system performance. Now we face the two main ways to run modern workloads: containers and virtual machines. AlmaLinux supports both natively — rootless containers with Podman without a daemon, and full virtualization with KVM.
This episode equips you with the Podman toolchain (Podman, Buildah, Skopeo), container integration into systemd with Quadlet, orchestration with podman-compose, then moves on to KVM/libvirt for virtualization.
Podman is Red Hat's daemonless container engine — no centralized daemon like Docker. Every container is an ordinary process run by systemd, making it more secure and more integrated with the system.
podman --version| Podman | Function |
|---|---|
podman pull <image> | Pulls an image from a registry |
podman run -d --name web -p 8080:80 nginx | Runs a container |
podman ps | Lists active containers |
podman stop/start/rm <name> | Stop, start, remove a container |
podman images | Lists local images |
Podman's main advantage: rootless — containers run as a regular user, without root privileges. This drastically shrinks the attack surface.
podman run -d --name web -p 8080:80 docker.io/library/nginx
podman psThe Podman ecosystem is completed by two companion tools:
skopeo inspect docker://docker.io/library/nginx:latest | headbuildah bud -t myapp:latest .unqualified-search-registries = ["docker.io", "quay.io"]
[aliases]
almalinux = "quay.io/almalinux/almalinux"podman run -it almalinux bashQuadlet turns container files into systemd units — containers are managed exactly like services:
[Unit]
Description=My containerized app
[Container]
Image=docker.io/library/nginx
PublishPort=8080:80
[Install]
WantedBy=default.targetsystemctl --user daemon-reload
systemctl --user enable --now myappFor multi-container workloads, use podman-compose — compatible with compose.yaml files:
sudo dnf5 install -y podman-composeservices:
web:
image: docker.io/library/nginx:latest
ports:
- "8080:80"
db:
image: docker.io/library/postgres:16
environment:
POSTGRES_PASSWORD: secretpodman-compose up -d
podman-compose psFor total isolation, use KVM — a full hypervisor that leverages CPU hardware virtualization.
sudo dnf5 install -y @virtualization
sudo systemctl enable --now libvirtdsudo virt-install \
--name web01 \
--vcpus 2 --memory 2048 \
--disk path=/var/lib/libvirt/images/web01.qcow2,size=20 \
--os-variant almalinux9 \
--network bridge=br0 \
--location /mnt/iso/AlmaLinux-9-latest-x86_64-dvd.isoInfo
The bridge network (br0) we created in episode 9 lets VMs get an IP from the same physical network — not internal NAT. That's why bridge networking is important for realistic virtualization.
virsh is the libvirt management CLI tool:
virsh list --all
virsh start web01
virsh console web01
virsh shutdown web01virsh pool-list
virsh undefine web01sudo dnf5 install -y virt-managerpodman-compose for multi-container stacks. Managing containers one by one is a recipe for mistakes.libvirtd. KVM won't work until the virtualization daemon is running.In this episode 18 you've run modern workloads on AlmaLinux: rootless containers with Podman, building images with Buildah, registry inspection with Skopeo, container integration into systemd via Quadlet, orchestration with podman-compose, and full KVM virtualization with virt-install, virsh, and bridge networking.
Key takeaways:
*.container) turns containers into systemd units.podman-compose runs multi-container stacks from a compose.yaml file.virt-install creates VMs, virsh manages them, br0 provides direct networking.With containers and VMs running, you're ready to take them to the cloud. In the next episode, Episode 19, we'll cover Cloud, WSL & Raspberry Pi Images — GenericCloud deployment with cloud-init on AWS, Azure, and GCP, AlmaLinux on Windows WSL, and the ARM64 Raspberry Pi images. See you there!