What is containerd and Why You Might Actually Care

So you've heard containerd is "the boring container runtime that Kubernetes uses" - but what does that actually mean for you? containerd is what happens when you rip out the container runtime from Docker and make it standalone. Docker Inc. extracted it years ago because everyone realized the fat Docker daemon was overkill for production Kubernetes. Now containerd handles the boring shit - starting containers, managing images, cleaning up when things die - while other tools handle the flashy stuff.

Why Kubernetes Ditched Docker (And Why You Should Know)

Back in 2020, Kubernetes announced Docker deprecation and everyone panicked. Turns out it was much ado about nothing - Kubernetes wasn't using Docker's fancy features anyway, just containerd underneath. So they cut out the middleman.

containerd architecture

Here's how it actually works: containerd manages container lifecycle through a gRPC API, then hands off the actual container execution to runc. It's like having a manager (containerd) who delegates the real work to someone else (runc). The OCI Runtime Specification defines exactly how this handoff works. Boring but reliable.

What containerd Actually Does

containerd handles the unglamorous but critical parts:

  • Image Management: Downloads and stores your bloated container images without bitching about disk space. Uses content-addressable storage to deduplicate layers.
  • Container Lifecycle: Starts your containers fast, kills them when asked, cleans up the mess. The container lifecycle API is actually sane.
  • Networking: Sets up basic networking then gets out of the way for CNI plugins to do the heavy lifting
  • Storage: Copy-on-write filesystem snapshots so you're not copying 500MB base images around like an idiot. Multiple snapshotters available (overlayfs, zfs, btrfs).
  • Security: Rootless containers, user namespaces, all the security theater that actually works

Current version is containerd 2.1.4 as of August 2025. The 1.7.x series is LTS until March 2026, so you have time to procrastinate upgrades. Note that the 2.x series introduced breaking changes in the config format and some API endpoints - test thoroughly before upgrading production systems.

Where You'll Actually Encounter This

Container Runtime Stack

Kubernetes: Every major cloud provider (AWS EKS, Google GKE, Azure AKS) switched to containerd. If you're deploying to managed k8s, you're using containerd whether you know it or not.

Local Development: Tools like nerdctl give you Docker-like commands (nerdctl run, nerdctl build) but with containerd underneath. It's for people who want Docker functionality without Docker Inc's increasingly hostile licensing.

Why It's Actually Better

Container Runtime Stack Architecture

containerd starts containers roughly 20-30% faster than Docker because there's less crap in the way. Memory usage is lower because it's not running a kitchen-sink daemon. These gains matter when you're spinning up thousands of containers, not so much for your 3-container development environment.

The CNCF graduated containerd, meaning it passed their bureaucracy test and won't randomly disappear. Big tech companies like Google, AWS, and Microsoft bet their infrastructure on it, so it's probably not going anywhere.

So containerd is clearly important and here to stay - but actually using it? That's where things get interesting. The theory is clean, but the practice has some sharp edges you need to know about.

containerd vs The Container Runtime Shitshow

Feature

containerd

Docker

Podman

CRI-O

What it actually is

Boring container runtime that works

The old reliable everyone knows

Red Hat's Docker replacement

The k8s purist option

Best for

Kubernetes clusters

Development (if you can afford it)

Rootless setups

OpenShift environments

Kubernetes

Default since Docker got shitcanned

Deprecated, use containerd underneath

Works but needs extra CRI setup

Built for k8s, nothing else

Image Building

Nope, use BuildKit separately

Has it built-in with BuildKit

Uses buildah (which is fine)

Nope, external tools only

Multi-container Apps

Use k8s or external orchestration

Docker Compose (still the easiest)

Pods via systemd or k8s

Only through Kubernetes

Rootless

✅ Works but setup is annoying

❌ Rootless mode is half-broken

✅ Actually designed for this

✅ Works fine

Memory Usage

~40MB (lightweight)

200MB+ (bloated as hell)

~60MB (reasonable)

~50MB (efficient)

Desktop GUI

None (command line only)

Docker Desktop (if you pay)

None

None

When it breaks

Check GitHub issues

Stack Overflow has answers

Good luck with Red Hat docs

Same as containerd

Actually Using containerd (And the Pain Points Nobody Mentions)

Now that you understand what containerd is and why it matters, let's talk about the reality of actually using it in production. The official docs make everything sound straightforward, but there are gotchas that'll waste hours of your time if you're not prepared.

Installation: It's Not As Simple As They Say

The official docs make installation sound straightforward, but there are gotchas. On Ubuntu, don't just apt install containerd - you'll get an ancient version that's broken. Add Docker's repo first: curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg then install containerd.io.

On CentOS/RHEL, the containerd package from the base repo is often broken. Use Docker's repo or build from source if you enjoy pain. Windows users: containerd works for Windows containers but the WSL2 integration is flaky at best.

The Configuration Nightmare

containerd Configuration Architecture

containerd's config lives in /etc/containerd/config.toml and the format changed between major versions. If you're upgrading from 1.x to 2.x, your config file will break. Run containerd config default > /etc/containerd/config.toml to generate a working starting point.

The config is TOML and looks like this clusterfuck:

[plugins."io.containerd.grpc.v1.cri".containerd.runtimes.runc.options]
  SystemdCgroup = true

Key things that will bite you:

  • SystemdCgroup = true: Required for k8s with systemd. Forget this and pods will randomly fail to start
  • Registry configuration: Goes in /etc/containerd/certs.d/ now, not in the main config. The hosts.toml documentation is your friend
  • Runtime selection: Default is runc. If you want gVisor or Kata, good luck with the configuration hell

Real-World Deployment Pain

Development Setup: Install nerdctl if you want Docker-like commands. nerdctl run nginx works like docker run nginx, but some Docker Compose features are missing or broken. BuildKit integration exists but it's not as seamless as Docker's.

Kubernetes: Most managed k8s services (EKS, GKE, AKS) use containerd by default now. You won't notice unless something breaks, then you'll miss Docker's better error messages. containerd errors are cryptic: failed to create containerd container: mount callback failed tells you nothing useful.

The ctr CLI Tool from Hell

containerd ships with `ctr`, which is the most user-hostile CLI tool ever created. Commands look like:

ctr namespace create test
ctr -n test image pull docker.io/library/nginx:latest
ctr -n test run --rm -t docker.io/library/nginx:latest nginx

Everything needs a namespace (-n). The default namespace is default but k8s uses k8s.io. Forget the namespace and your containers disappear into the void.

Monitoring: It Exists But It's Basic

Container Monitoring Dashboard

containerd exposes Prometheus metrics at /metrics but they're low-level: containerd_container_blkio_io_serviced_recursive_total. You'll need something like cAdvisor or node-exporter for useful container metrics.

For debugging, logs go to journald (journalctl -u containerd) and they're verbose. Enable debug logging at your own risk - it will fill your disk. The tracing guide helps with deeper issues.

Security: Rootless Works But Setup Sucks

Rootless Container Security

Rootless containerd is possible but the setup is painful. You need:

  • User namespace support in your kernel
  • Multiple config files in the right places
  • The rootlesskit wrapper around everything
  • Prayers to the container gods

Most people just run as root and deal with the security implications.

When Things Break

Kubernetes Troubleshooting Flowchart

containerd Configuration Flow

Common issues you'll hit:

  • "failed to start container": Usually cgroup issues. Check if systemd cgroups are enabled in /etc/containerd/config.toml. The error might also appear as "failed to create shim task" in the logs
  • Image pulls hang: Registry configuration is fucked. Check /etc/containerd/certs.d/ for proxy settings or auth issues. Look for "connection timeout" or "x509" certificate errors in journalctl -u containerd
  • Containers won't stop: containerd is waiting for something. kill -9 the containerd process and start over. This often happens when the shim process gets stuck - check ps aux | grep containerd-shim for orphaned processes
  • Permission denied: SELinux or AppArmor is blocking something. Check ausearch -m avc for SELinux violations or disable temporarily with setenforce 0 to test. Also verify user has access to /run/containerd/containerd.sock

The GitHub issues are your best bet for troubleshooting. Stack Overflow has fewer containerd answers than Docker ones. Check the troubleshooting guide and common issues docs first.

Questions People Actually Ask

Q

Do I need to know about containerd?

A

Probably not. If you're using Kubernetes, you're already using containerd whether you know it or not. If you're doing local development with Docker, just keep using Docker. containerd is infrastructure that works best when you ignore it.

Q

Kubernetes deprecated Docker - am I fucked?

A

No, you're fine. The "Docker deprecation" was mostly marketing panic. Your Docker images still work, your k8s deployments still work. Kubernetes just uses containerd directly now instead of going through Docker's daemon. Your containers don't care.

Q

Should I switch from Docker to containerd for development?

A

Unless you're allergic to Docker's licensing fees or really want rootless containers, just stick with Docker. containerd with nerdctl gives you Docker-like commands, but some Docker Compose features don't work right and the ecosystem assumes Docker exists.

Q

Is containerd actually free or is there a catch?

A

It's Apache 2.0 licensed and totally free. No subscriptions, no per-container fees, no licensing bullshit. The CNCF owns it so it won't suddenly become commercial like Docker Desktop did.

Q

How do I install this thing without breaking my system?

A

On Ubuntu: Add Docker's repo first, then apt install containerd.io. Don't use the distro package - it's ancient.On CentOS/RHEL: Also use Docker's repo. The base repo version is broken.On Windows: Good luck. It works for Windows containers but WSL2 support is flaky.

Check containerd.io/downloads for the full installation hell.

Q

What version should I actually use?

A

Stick with containerd 1.7.x for production

  • it's the LTS version until March 2026. containerd 2.x is newer but less battle-tested. Don't use whatever ancient version your distro ships by default.
Q

Can containerd build Docker images?

A

Nope. You need BuildKit, buildah, or kaniko. This is annoying if you're used to docker build just working. BuildKit integration exists but it's more complicated than Docker's setup.

Q

Why is the ctr command so terrible?

A

Because it's designed for debugging, not human use.

Everything needs a namespace: ctr -n k8s.io containers list to see k8s containers.

Use nerdctl instead

  • it has sane commands like nerdctl ps.
Q

My containers are stuck in "Creating" - what's wrong?

A

Usually cgroup configuration. Add SystemdCgroup = true to your /etc/containerd/config.toml if you're using systemd (which you probably are). Run systemctl restart containerd after changing the config.

Q

How do I see what's actually running?

A

ctr -n k8s.io containers list for k8s containers, ctr -n default containers list for everything else. Or install nerdctl and use nerdctl ps like a civilized human being.

Q

Where are the logs when things break?

A

journalctl -u containerd shows containerd service logs. Enable debug logging if you hate your disk space: containerd --log-level debug. Container logs depend on what's calling containerd (usually k8s handles this).

Q

Is rootless containerd worth the pain?

A

Only if you're security-paranoid or can't run as root. The setup involves rootlesskit, multiple config files, and hoping your kernel supports user namespaces. Most people just run as root and deal with the security implications.

Essential containerd Resources

Related Tools & Recommendations

tool
Similar content

Helm: Simplify Kubernetes Deployments & Avoid YAML Chaos

Package manager for Kubernetes that saves you from copy-pasting deployment configs like a savage. Helm charts beat maintaining separate YAML files for every dam

Helm
/tool/helm/overview
100%
pricing
Similar content

Docker, Podman & Kubernetes Enterprise Pricing Comparison

Real costs, hidden fees, and why your CFO will hate you - Docker Business vs Red Hat Enterprise Linux vs managed Kubernetes services

Docker
/pricing/docker-podman-kubernetes-enterprise/enterprise-pricing-comparison
99%
tool
Similar content

GKE Overview: Google Kubernetes Engine & Managed Clusters

Google runs your Kubernetes clusters so you don't wake up to etcd corruption at 3am. Costs way more than DIY but beats losing your weekend to cluster disasters.

Google Kubernetes Engine (GKE)
/tool/google-kubernetes-engine/overview
99%
troubleshoot
Similar content

Fix Kubernetes Service Not Accessible: Stop 503 Errors

Your pods show "Running" but users get connection refused? Welcome to Kubernetes networking hell.

Kubernetes
/troubleshoot/kubernetes-service-not-accessible/service-connectivity-troubleshooting
89%
tool
Similar content

Helm Troubleshooting Guide: Fix Deployments & Debug Errors

The commands, tools, and nuclear options for when your Helm deployment is fucked and you need to debug template errors at 3am.

Helm
/tool/helm/troubleshooting-guide
82%
tool
Similar content

Fix gRPC Production Errors - The 3AM Debugging Guide

Fix critical gRPC production errors: 'connection refused', 'DEADLINE_EXCEEDED', and slow calls. This guide provides debugging strategies and monitoring solution

gRPC
/tool/grpc/production-troubleshooting
71%
tool
Similar content

Django Production Deployment Guide: Docker, Security, Monitoring

From development server to bulletproof production: Docker, Kubernetes, security hardening, and monitoring that doesn't suck

Django
/tool/django/production-deployment-guide
69%
tool
Similar content

Flux GitOps: Secure Kubernetes Deployments with CI/CD

GitOps controller that pulls from Git instead of having your build pipeline push to Kubernetes

FluxCD (Flux v2)
/tool/flux/overview
64%
tool
Similar content

Linkerd Overview: The Lightweight Kubernetes Service Mesh

Actually works without a PhD in YAML

Linkerd
/tool/linkerd/overview
60%
tool
Similar content

ArgoCD - GitOps for Kubernetes That Actually Works

Continuous deployment tool that watches your Git repos and syncs changes to Kubernetes clusters, complete with a web UI you'll actually want to use

Argo CD
/tool/argocd/overview
57%
tool
Similar content

Open Policy Agent (OPA): Centralize Authorization & Policy Management

Stop hardcoding "if user.role == admin" across 47 microservices - ask OPA instead

/tool/open-policy-agent/overview
57%
tool
Similar content

Aqua Security - Container Security That Actually Works

Been scanning containers since Docker was scary, now covers all your cloud stuff without breaking CI/CD

Aqua Security Platform
/tool/aqua-security/overview
55%
howto
Similar content

FastAPI Kubernetes Deployment: Production Reality Check

What happens when your single Docker container can't handle real traffic and you need actual uptime

FastAPI
/howto/fastapi-kubernetes-deployment/production-kubernetes-deployment
53%
tool
Similar content

etcd Overview: The Core Database Powering Kubernetes Clusters

etcd stores all the important cluster state. When it breaks, your weekend is fucked.

etcd
/tool/etcd/overview
50%
troubleshoot
Similar content

Kubernetes Crisis Management: Fix Your Down Cluster Fast

How to fix Kubernetes disasters when everything's on fire and your phone won't stop ringing.

Kubernetes
/troubleshoot/kubernetes-production-crisis-management/production-crisis-management
48%
tool
Similar content

Istio Service Mesh: Real-World Complexity, Benefits & Deployment

The most complex way to connect microservices, but it actually works (eventually)

Istio
/tool/istio/overview
46%
troubleshoot
Similar content

Fix Kubernetes Pod CrashLoopBackOff - Complete Troubleshooting Guide

Master Kubernetes CrashLoopBackOff. This complete guide explains what it means, diagnoses common causes, provides proven solutions, and offers advanced preventi

Kubernetes
/troubleshoot/kubernetes-pod-crashloopbackoff/crashloop-diagnosis-solutions
44%
troubleshoot
Similar content

Fix Kubernetes ImagePullBackOff Error: Complete Troubleshooting Guide

From "Pod stuck in ImagePullBackOff" to "Problem solved in 90 seconds"

Kubernetes
/troubleshoot/kubernetes-imagepullbackoff/comprehensive-troubleshooting-guide
44%
troubleshoot
Similar content

Docker CVE-2025-9074 Forensics: Container Escape Investigation Guide

Docker Container Escape Forensics - What I Learned After Getting Paged at 3 AM

Docker Desktop
/troubleshoot/docker-cve-2025-9074/forensic-investigation-techniques
44%
troubleshoot
Similar content

Fix Snyk Authentication Registry Errors: Deployment Nightmares Solved

When Snyk can't connect to your registry and everything goes to hell

Snyk
/troubleshoot/snyk-container-scan-errors/authentication-registry-errors
41%

Recommendations combine user behavior, content similarity, research intelligence, and SEO optimization