Docker, Podman, and containerd Are Converging—So Why Is Choosing Harder Than Ever?

In 2026, the engines look alike under the hood. But the real costs are hiding in your CI pipelines, your Kubernetes upgrades, and your team's sanity.

By Oliver Weber

Cloud Infrastructure Strategist

Last Updated: June 2, 2026

Reading Time: 7 min read


In December 2025, one of our on-call engineers was jolted awake by PagerDuty in the middle of the night.

The application wasn't down. Traffic hadn't spiked.

The problem was that after upgrading to containerd 2.2, historical image layers gradually filled node disks over the course of three days, eventually triggering a cascading eviction event across the cluster.

The rollback took forty minutes.

The real trouble came the next morning, when our CTO asked a seemingly simple question during the postmortem:

"Why did we choose containerd in the first place?"

Nobody could answer in a single sentence.

One person said, "Because Kubernetes uses it by default."

Another said, "Because Docker uses it underneath anyway."

Someone else said, "Because it has the strongest community."

None of those answers were wrong. But together, they exposed a deeper problem:

In 2026, Docker, Podman, and containerd are becoming increasingly similar from a technical perspective, yet choosing a container engine has become far more complicated than it was five years ago.

In 2020, selecting a container engine largely meant choosing a CLI and a runtime.

In 2026, choosing an engine means selecting an entire ecosystem contract—one that includes licensing models, cloud vendor lock-in, toolchain compatibility, upgrade strategies, and a collection of hidden engineering costs that are nearly impossible to see at the beginning.

Our team decided in Q4 2025 to standardize our container tooling. We assumed it was simply a matter of choosing an engine.

Six months later, we realized that we had not chosen an engine at all—we had chosen among three completely different ecosystems.


Docker's Trojan Horse: When You Think You're Choosing an Engine, You're Actually Signing an Ecosystem Contract

The first step in our evaluation process was to examine Docker.

After all, it was the tool our team knew best.

But Docker 29's release notes made us pause.

The default image storage backend had switched to the containerd image store. That meant Docker Engine and containerd now shared image layers directly. Docker could seamlessly access images stored by containerd, while the reverse was not necessarily true.

Diagram comparing storage architecture of Docker Engine before version 29 and 29.x new architecture

Docker's Trojan Horse

The engineering team's first reaction was:

"Isn't that a good thing? The boundaries are disappearing. Doesn't that make the choice easier?"

No. Blurred boundaries do not simplify decisions—they make it easier to sign a contract you never fully read.

What was Docker in 2020?

A CLI, a runtime, an image store, and a developer workflow.

A technical team could decide whether to use it without involving anyone else.

What is Docker in 2026?

Docker Desktop + containerd underneath + BuildKit for builds + Compose for orchestration + Extensions marketplace + an enterprise subscription and licensing model.

The decision matrix did not shrink. It exploded. And the first new dimension was introduced by the procurement department.

Five years ago, engineering teams discussed Docker in terms of OverlayFS performance and network driver selection.

Today, many organizations must involve procurement when discussing container platforms—not because of a technical requirement, but because of Docker Desktop licensing.

This is perhaps the clearest example of how technical convergence can create greater decision complexity.

Docker Engine may be technically similar to containerd.

Docker Desktop licensing is not.

We ran an internal test.

Developers built images locally using Docker Desktop 29 with the default containerd image store. Those images were then deployed onto production nodes running pure containerd.

Occasionally, layer permission issues appeared.

The root cause was a subtle difference in how BuildKit and containerd snapshotters handled UID/GID ownership. One relied on OverlayFS userxattr behavior, while the other behaved differently under certain kernel versions.

This was not a software defect. It was the seam where two ecosystems met.

You may think you're choosing "familiar Docker," but you're actually choosing:

  • Docker Desktop's virtualization layer on macOS and Windows
  • BuildKit's caching model, which may not align with Kaniko or Podman-based CI pipelines
  • Docker Hub's rate limits and image scanning policies
  • Enterprise subscription costs and compliance requirements

We are not comparing three engines. We are comparing three completely different developer-experience contracts—and one of those contracts requires procurement's signature.


containerd's Ecosystem Earthquake: When You Think You're Choosing a Runtime, You're Actually Choosing Infrastructure Lock-In

Since Docker itself relies on containerd, we made what seemed like a rational decision:

Let's standardize on containerd directly and eliminate the middle layer.

Then containerd 2.2 arrived.

The config.toml format was upgraded from v2 to v3.

Legacy configurations failed outright.

Our Ansible roles and Terraform modules stopped working because plugin namespaces were refactored from io.containerd.grpc.v1.cri to io.containerd.cri.v1.services.

Default image storage paths changed.

Node cleanup scripts accidentally removed data from staging environments.

But the real shock was not technical.

In the past, switching runtimes meant changing a tool.

Today, changing containerd means changing your Kubernetes ecosystem, your cloud provider validation matrix, your monitoring stack, and your upgrade strategy.

During testing in our staging environment, we discovered that the default value of discard_unpacked_layers had changed from true to false.

The release notes dedicated only a single line to the change.

The result?

Historical image layers accumulated for days, disks filled up, and cascading pod evictions followed—the very PagerDuty incident described at the beginning of this article.

This was not a configuration mistake.

When everyone depends on the same foundation, a single default-value change becomes an ecosystem-wide earthquake.

Even more subtle is cloud-provider fragmentation.

AWS EKS ships containerd versions such as 1.7.23-eks-custom.

GKE ships versions like 2.0.1-gke.5.

You may believe you're choosing "open-source containerd."

In reality, you're choosing a cloud vendor's customized containerd fork.

Migrating between cloud providers may require revalidating your runtime behavior from the ground up.

According to the CNCF Annual Survey 2026, containerd powers approximately 78% of Kubernetes clusters worldwide, a figure echoed in the Sysdig Container Security and Usage Report 2026.

It has evolved from an optional runtime into the default runtime that most organizations inherit rather than select.

And once a technology becomes the default, its upgrades are no longer optional optimizations.

They become mandatory ecosystem migrations.

containerd was not truly chosen by us. It was imposed by the Kubernetes ecosystem. And once something becomes unavoidable, every tremor in its foundation becomes our earthquake.


Podman's Security Tax: When You Think You're Choosing Security, You're Actually Choosing Organizational Change

After experiencing the impact of the containerd upgrade, our CTO proposed another option:

"What about Podman? Rootless containers are safer, and there is no daemon."

So we tested Podman 5.8.

Screenshot collage of Podman Desktop GUI showing containers, extensions and resources panels

Podman 5.8

The engineering team's initial impression was positive.

The pasta networking backend was fast.

Rootless isolation on single-node deployments was mature and reliable.

But every security benefit came with an organizational invoice attached.

Rootless UID mapping changed file ownership in CI build artifacts by mapping them into high UID ranges.

Downstream static-analysis pipelines and artifact repositories required modification.

Shared NFS storage permissions had to be redesigned.

Certain container registries handled rootless-pushed manifests differently, leading to occasional push failures.

Meanwhile, the developer experience of Podman Desktop on macOS still lagged behind Docker Desktop, increasing onboarding costs for new engineers.

At one point, we attempted a hybrid strategy:

  • Docker for local development
  • Podman for CI
  • containerd for production

The result was predictable chaos.

Image caching strategies diverged.

Differences between Docker's layer cache and Podman's VFS/Overlay behavior significantly increased CI build times.

More subtly, docker-compose and podman-compose handled network name resolution differently, leading to frustrating situations where:

"It works on my machine, but fails in CI."

The issue appeared again and again.

Security teams wanted rootless isolation. Developers wanted productivity. Platform teams wanted standardization.

Podman was not merely a technical decision.

It was an organizational decision.

Podman's rootless model can be nearly perfect on an individual node.

At the organizational level, however, it resembles an island connected by bridges you must build yourself.


The Real Choice Is No Longer the Engine

In 2026, organizations are rarely choosing a container engine.

They are choosing the ecosystem contract behind it.

  • You think you're choosing Docker → You're actually choosing Docker Desktop workflows, the Docker Hub ecosystem, and an enterprise subscription model.
  • You think you're choosing containerd → You're actually choosing Kubernetes' default path, cloud-provider validation matrices, and the broader CNCF ecosystem.
  • You think you're choosing Podman → You're actually choosing the Red Hat ecosystem, the rootless security model, and the organizational costs that come with it.

In 2020, comparing these technologies meant comparing CLI commands and daemon architectures.

In 2026, comparing them means comparing licensing costs, cloud-vendor lock-in, CI/CD compatibility, security-compliance engineering overhead, learning curves, and the long-term cost of maintaining organizational knowledge.

Container engines are becoming the new Linux kernel.

Today, most teams do not spend much time debating whether Linux 6.8 is superior to Linux 6.12.

What they care about is the ecosystem built on top of the kernel—the distribution, the driver support, and the cloud-provider integrations.

Docker, Podman, and containerd are moving toward the same destiny.

They are not disappearing.

They are becoming so fundamental that people stop talking about them.

Yet the consequences of choosing their ecosystems continue to grow heavier every year.


This article is based on publicly available information from the CNCF Annual Survey 2026, Datadog State of Container Security Report 2026, Sysdig Container Security and Usage Report 2026, and official release notes from containerd, Docker, and Podman. Internal testing observations are drawn from the author's team's real-world migration experiences between 2025 and 2026.


Oliver Weber

Cloud Infrastructure Strategist

Oliver Weber writes about cloud infrastructure, platform engineering, and large-scale distributed systems. He is particularly interested in how infrastructure becomes invisible over time, turning once-complex technologies into foundational utilities that developers rarely think about.

Recommended for you