Four layers under one command
Typing docker run invokes a stack of separate programs, each with a narrow job. Knowing the split matters because production systems increasingly use only part of it.
The client parses your command and calls an API. It does no container work at all.
The daemon implements that API: image building, network setup, volume management, and orchestration of the layers below.
A container supervisor, typically containerd, manages image pull and unpack, storage, and the lifecycle of running containers. It is what most orchestrators talk to directly, skipping the daemon entirely.
A low-level runtime, typically runc, does the actual work from the first lesson: create namespaces, configure cgroups, pivot the root, drop capabilities, exec. It runs once per container start and then exits.
That last point surprises people. runc is not a long-running process babysitting your container; it sets everything up, executes your program, and leaves. The container is your process, exactly as the first lesson said.
So the stack is a chain of increasingly specific tools, and the boundaries between them are standardised.

