Podman replaces the daemon in CI/CD
Podman captures 23% of enterprise runtime deployments in 2026 as organizations adopt Red Hat's security-first runtime. This transition offers safer multi-tenant CI/CD environments by eliminating the privileged daemon used by Docker.
Podman captures 23% of enterprise runtime deployments in 2026. This growth happens as organizations move toward Red Hat’s security-first runtime. Podman removes the privileged daemon that makes Docker a target for attackers. Every podman run command starts a container as a child process of the user session. This design eliminates the risk of an attacker using the daemon socket to gain host root access. I find this architecture safer for multi-tenant CI/CD environments. Podman also drops 11 kernel capabilities by default compared to the 14 capabilities used by Docker. I use Podman.
Rootless Podman requires cgroups v2 and unprivileged user namespaces. Rocky Linux 9 and 10 enable these by default, but Rocky Linux 8 requires a kernel parameter change to enable cgroups v2. Users encounter issues with bind mounts because rootless Podman maps container UIDs to a range of unprivileged host UIDs via /etc/subuid and /etc/subgid. This mapping prevents container processes from accessing files owned by the host user. I find the permission errors in NFS and shared filesystems difficult to manage because these filesystems do not understand user namespaces. When users use supplementary groups in a rootless container, those groups may appear as nobody (65534) instead of the actual GIDs. To fix this, users must specify each supplementary GID explicitly with –group-add.
CVE-2026-31431 allows a local user to get a root shell via a Python script. This exploit is called Copy Fail. The blast radius remains limited because of Podman’s user namespace implementation. This is different from the CVE-2024-32462 vulnerability in bubblewrap, which allows sandbox escapes via argument injection. This vulnerability has a CVSS of 8.4. Flatpak users must ensure their xdg-desktop-portal is 1.18.4 or later to avoid bubblewrap issues. Security scanners also confused users in late 2025 by linking CVE-2025-61728 to slirp4netns. That vulnerability has a CVSS of 6.5 and exists in the Go archive/zip library instead.
Networking performance trade-offs
Because Podman 5.x uses pasta as the default rootless networking backend, developers get full IPv6 support with NDP and DHCPv6, though they must account for the single-threaded architecture when managing high concurrency and low-latency connections. I find the single-threaded nature of pasta an annoying bottleneck under heavy load. Pasta is written in C with 9,500 lines of code and zero external dependencies. It creates a tap device directly inside the network namespace. It also uses kernel splice() for local-to-local TCP connections. Pasta is the default.
| Concurrency | pasta (req/s) | slirp4netns (req/s) |
|---|---|---|
| c=1 | 1,699 | 1,148 |
| c=4 | 8,894 | 5,600 |
| c=8 | 13,852 | 13,925 |
| c=16 | 14,289 | 24,852 |
| c=32 | 15,166 | 28,931 |
Slirp4netns scales better once you hit high concurrency. It has had years of multi-threaded optimization. It has been the default since Podman 2.0. Docker is proprietary.
Moving away from Docker Content Trust
Docker is retiring Notary v1 and Docker Content Trust. The full shutdown occurs on December 8, 2026. Most users now use Sigstore/Cosign or Notation. Setting DOCKER_CONTENT_TRUST=1 requires changing automation. Docker Hub also enforces pull rate limits. Anonymous users can only make 100 pulls every 6 hours. Authenticated Docker Personal accounts can make 200 pulls. Pro and Business accounts have unlimited pull rates. I find the need for registry mirrors in CI/CD pipelines a hassle.
To replace Docker Content Trust, teams can use Sigstore/Cosign or Notation. To ensure pulls are repeatable, you must use image digests. Podman’s popularity grows as it works as a near drop-in CLI replacement for Docker. Podman controls 19% to 23% of enterprise runtime deployments in 2026.
Will pasta eventually match slirp4netns’s multi-threaded concurrency?