This episode covers firecracker-containerd: the containerd runtime that runs each container inside its own Firecracker microVM. You'll understand the runtime and overlay snapshotter components, then walk through the flow of pulling an image, unpacking it, and running a container in a microVM with bridge networking and registry access.

So far we've managed microVMs with the raw API: curl to a Unix socket, JSON, boot, snapshot. Episode 11 brings Firecracker into a friendlier world: containers. With firecracker-containerd, you still write nerdctl run or ctr run as usual — but behind the scenes, every container runs inside a fully isolated Firecracker microVM.
Why is this episode important? Containers are an established software distribution format, and most teams are more comfortable managing images than kernels and rootfs. firecracker-containerd unites two worlds: container ergonomics (pull images, registries, OCI) with microVM security (hardware isolation). It's also the foundation of the "sandbox per user/job" pattern we'll cover in episodes 12 and 18.
firecracker-containerd is a containerd runtime that adds Firecracker microVM support to containerd. The difference from ordinary containerd:
As a result, from the developer's point of view, it's still pull + run. From a security point of view, each container gets hardware-grade isolation — not just Linux namespaces.
Because containerd follows the OCI Runtime specification (runtime class containerd-firecracker), tooling like nerdctl, ctr, or Kubernetes (with runtime classes) can use it without major changes. This is the pattern that lets microVMs appear in the existing container ecosystem.
The core component implementing the OCI interface. It's the one that orchestrates: creating the microVM, running processes inside it, and maintaining the correspondence between containers and microVMs. This runtime translates OCI requests (Create, Start, Kill) into Firecracker operations — boot, put snapshot, resume, and so on.
A container image is made of layers. firecracker-containerd uses a snapshotter to assemble those layers into a bootable microVM rootfs. The pattern:
The snapshotter decides how a container image becomes the guest filesystem — this is the part most different from ordinary containerd and the most sensitive to boot performance.
As usual, pull the image from the registry:
sudo nerdctl --namespace=fc pull docker.io/library/alpine:latestThe snapshotter places the layers on disk, then builds the microVM rootfs:
sudo nerdctl --namespace=fc create --runtime io.containerd.firecracker.v1 fc-alpineAt this stage, the image layers are turned into a filesystem that can boot as a guest disk. A key detail to understand: each container gets its own microVM — no container shares a microVM, because that's the whole point of the isolation.
On start, the runtime builds the microVM: the jailer for isolation, kernel + rootfs from the image, and TAP and bridge for networking:
sudo nerdctl --namespace=fc start fc-alpine
sudo nerdctl --namespace=fc exec fc-alpine uname -aThe uname -a output inside the guest will show the guest kernel — different from the host kernel — proof that the process runs inside a VM, not in a host namespace. That's a quick way to verify the isolation is actually happening.
Container microVMs need networking and registry access. firecracker-containerd sets up:
The guest reaches the registry through the same bridge — pulling images inside the microVM (for images not bundled at create time) or through a proxy the host has prepared. For production, images are usually already available on the host (the bundled pattern), so the guest needs no external registry access at runtime — faster and more secure.
Tip
Two networking patterns worth knowing: bundled (image available locally, guest offline) for maximum security, and proxy (guest pulls through a host proxy) for flexibility. Most production setups use bundled for fast boot and cleaner network isolation.
The benefits of using firecracker-containerd:
nerdctl, Kubernetes (runtime classes), and other OCI tooling.The honest limitations:
nerdctl run without --runtime uses the default runtime (host namespace) — make sure --runtime io.containerd.firecracker.v1 is set.The key takeaways:
firecracker-containerd runs OCI containers inside Firecracker microVMs.containerd-firecracker) + overlay snapshotter.In the next episode 12 we'll scale up: Orchestrator — firectl, Flintlock & MicroVMs — using firectl as a simple CLI to launch Firecracker, Flintlock from liquidmetal to manage many microVMs as a service, and Kubernetes integration via containerd and the microvm runtime class for the sandbox-per-user/job pattern.