Docker Architecture Explained: Client, Daemon, Images & Registries
Understand Docker architecture end to end: the CLI, dockerd, containerd and runc, images, containers and registries, plus what really happens when you run docker run.
Docker Architecture Explained: Client, Daemon, Images, Containers, and Registries
Typing docker run nginx feels like a single action, but behind it several separate programs cooperate: a client that sends a request, a daemon that coordinates the work, a runtime stack that creates the container, a registry that supplies the image, and the Linux kernel that enforces isolation. Most Docker problems, from "Cannot connect to the Docker daemon" to slow pulls and missing images, become easy to diagnose once you know which of these parts is involved.
This guide explains Docker architecture from end to end. You will learn what each component does, how they communicate, what really happens step by step when you run a container, and how the architecture changes on Docker Desktop and in Kubernetes. Everything reflects Docker Engine 29, as of October 2026.
Quick Answer
Docker uses a client-server architecture with five main building blocks:
Under the daemon, containerd manages container lifecycles and image content, and runc creates each container using Linux kernel features: namespaces for isolation and cgroups for resource limits.
The Big Picture: How Docker Components Fit Together
Figure 1: Docker architecture: client, Docker host and registry
The diagram shows three zones:
The client is where you type commands. It can be on the same machine as the daemon or on a different one.
The Docker host is the machine that actually runs containers. It contains the daemon, the runtime stack (containerd, shims and runc), local images, and the containers themselves, all sitting on the Linux kernel.
The registry is a remote service that stores images. The daemon, not the client, pulls images from it and pushes images to it.
The separation matters. Because the client and daemon communicate through an API, one client can control many hosts, and many tools (Compose, IDEs, CI systems) can control the same daemon.
1. The Docker Client
The Docker client is the program you interact with, most commonly the docker command-line interface. The client does not create containers, download images or configure networks itself. It turns each command into an HTTP request to the Docker Engine API, sends it to a daemon, and displays the response.
Ways the Client Talks to the Daemon
You choose which daemon the client talks to with Docker contexts, or with the DOCKER_HOST environment variable. See our tutorial Docker Contexts: Manage Remote Docker Hosts for the full setup.
Client Plugins
Several familiar commands are CLI plugins that extend the client while still talking to the same daemon:
docker compose — defines and runs multi-container applications from a compose.yaml file.
docker buildx — the full interface to BuildKit, including multi-platform builds.
docker scout — image vulnerability analysis (bundled with Docker Desktop).
API Version Negotiation
The client and daemon each support a range of API versions and automatically agree on one they both understand. Run docker version to see both sides. Docker Engine 29 raised the minimum supported API version to 1.44, so very old clients can no longer talk to a current daemon; upgrading the client fixes the resulting "client version is too old" error.
docker version --format "Client API: {{.Client.APIVersion}} Server API: {{.Server.APIVersion}}"
2. The Docker Daemon (dockerd)
The Docker daemon, dockerd, is a long-running background service on the Docker host. It listens for API requests and is the central coordinator of everything Docker does on that machine.
What the Daemon Is Responsible For
Daemon Configuration and Files
Security: The daemon traditionally runs as root, so anyone who can reach its API socket, including members of the docker group, effectively has root access to the host. Rootless mode runs the daemon as an ordinary user instead; see our tutorial Rootless Docker: Setup and Limitations.
For a deeper look at the daemon on its own, see our tutorial Docker Daemon Explained.
Under the Hood: containerd, Shims and runc
dockerd does not create container processes itself. Since Docker 1.11, the runtime work has been split into smaller, specialised components. This design is why the same building blocks also power Kubernetes.
Two industry standards from the Open Container Initiative (OCI) connect these layers: the image specification, which defines how images are packaged, and the runtime specification, which defines how a runtime such as runc creates a container from a filesystem bundle and a configuration file. Because Docker follows these standards, an image built with Docker runs on Podman, containerd and Kubernetes, and the reverse.
Why This Layering Matters in Practice
Daemon upgrades without downtime. With "live-restore": true in daemon.json, you can restart or upgrade dockerd while containers keep running, because the shims keep them alive.
Clearer troubleshooting. A container that fails to start with an "OCI runtime create failed" error points to runc and the kernel, not to the network or the registry.
Kubernetes compatibility. Kubernetes talks to containerd directly and does not use dockerd at all, yet runs the same images.
You can see the stack on any Linux host running containers:
systemctl status docker containerd --no-pager
ps -eo pid,ppid,cmd | grep -E "dockerd|containerd" | grep -v grep
The output shows dockerd, containerd, and one containerd-shim-runc-v2 process for each running container. You will not see runc itself, because it exits as soon as each container has started.
3. Docker Images
A Docker image is a read-only template containing everything an application needs to run: a minimal operating system filesystem, runtime, libraries, application code and default settings such as the command to start and the user to run as.
Images Are Made of Layers
An image is a stack of read-only layers. Each filesystem-changing instruction in a Dockerfile, such as RUN, COPY or ADD, produces a new layer containing only the files that changed. Layers are identified by a hash of their content, which gives three big benefits:
Sharing: if ten images use the same base image, its layers are stored on disk only once.
Faster pulls and pushes: only layers the destination does not already have are transferred.
Build caching: unchanged instructions reuse existing layers instead of running again.
docker image history nginx:1.29
What an Image Consists Of
When you pull a multi-platform image, Docker reads the index and downloads only the manifest and layers for your machine's platform. That is why the same docker pull nginx works on an Intel server and on an Apple silicon Mac.
Tags and Digests
Every image is identified in two ways:
A tag, such as nginx:1.29, is a human-friendly, mutable label. The publisher can move it to a newer image at any time.
A digest, such as nginx@sha256:..., is a hash of the image manifest. It is immutable: the same digest always refers to exactly the same image.
Use tags while developing and digests when you need guaranteed reproducibility, for example in production deployments.
Docker Engine 29: Fresh installations of Docker Engine 29 store images in the containerd image store by default, instead of Docker's older graph-driver store. Image content and snapshots therefore live under /var/lib/containerd, and multi-platform images and attestations are kept intact locally. Hosts upgraded from older versions keep their existing store until migrated. Run docker info and look at the storage driver line to see which store a host uses.
4. Docker Containers
A container is a runnable instance of an image. Docker creates it by adding a thin writable layer on top of the image's read-only layers and starting a process with its own isolated view of the system.
Image vs Container
How Containers Are Isolated
A container is not a virtual machine. It is an ordinary Linux process that the kernel isolates using two features:
Because containers share the host's kernel, they start in milliseconds and use far less memory than virtual machines. It also means a Linux container needs a Linux kernel, which is why Docker Desktop runs a small Linux virtual machine on macOS and Windows. Our tutorial Container Isolation and Linux Namespaces explores this in depth.
Containers Are Disposable; Data Is Not
The writable layer is deleted when the container is removed. Anything that must survive, such as database files or uploads, belongs in a volume or a bind mount, which live outside the container's lifecycle.
5. Docker Registries
A registry is a service that stores and distributes images. Within a registry, images are organised into repositories (for example library/nginx), and each repository holds many tagged versions.
How Docker Resolves an Image Name
A full image reference has up to five parts. Docker fills in defaults for any part you leave out:
registry/namespace/repository:tag@digest
nginx
= docker.io/library/nginx:latest
bitcodematrix/api:1.4
= docker.io/bitcodematrix/api:1.4
123456789012.dkr.ecr.ap-south-1.amazonaws.com/api:1.4
= an image in a private Amazon ECR repository
Best practice: Never rely on the implicit latest tag in production. It changes whenever the publisher releases a new version, so two servers can run different code from the same reference. Use a specific version tag or a digest.
Pulling and Pushing
The daemon talks to registries using the OCI Distribution protocol over HTTPS. For a pull, it fetches the manifest (choosing your platform from the index), then downloads only the layers it does not already have. For a push, it uploads only the layers the registry does not already have, then the manifest. Credentials from docker login are stored by the client and passed to the daemon with each request.
Supporting Objects: Networks and Volumes
Images, containers and registries are the core of the architecture, but the daemon also manages two other kinds of objects that containers depend on:
What Happens When You Run docker run nginx
Here is the complete journey through the architecture, from pressing Enter to a running web server:
docker run -d --name web -p 8080:80 nginx:1.29
Every later command, such as docker logs web, docker stop web or docker rm web, follows the same path: client to API to daemon to containerd and the shim.
What Happens When You Build and Push an Image
docker build -t bitcodematrix/api:1.4 . packages the build context (your project directory, minus anything in .dockerignore) and sends it to the daemon.
BuildKit, the builder inside the daemon, reads the Dockerfile, pulls the base image if needed, runs each instruction (reusing cached layers where possible) and produces a new image with its layers, configuration and manifest.
docker push bitcodematrix/api:1.4 makes the daemon authenticate to the registry, upload any layers the registry does not already have, and then upload the manifest.
Any other Docker host, CI runner or Kubernetes cluster can now pull the exact same image.
Docker Desktop Architecture: What Is Different?
On macOS and Windows, the kernel is not Linux, so Linux containers cannot run directly on the host. Docker Desktop adds a lightweight Linux virtual machine:
The client (docker CLI) runs natively on macOS or Windows.
The daemon, containerd, runc and containers run inside the Linux VM (using WSL 2 on Windows, or Apple's virtualization framework on macOS).
Docker Desktop forwards the API socket, published ports and file-sharing between your host and the VM, so it feels as if containers run locally.
This is why file-sharing performance and memory settings matter on Docker Desktop: containers can only use the resources allocated to the VM.
Docker Architecture vs Kubernetes
Docker and Kubernetes share the same lower layers but differ at the top:
Kubernetes removed its built-in Docker integration ("dockershim") in version 1.24 and talks to containerd directly. This changed nothing for images: an image built with Docker runs unchanged on Kubernetes because both follow the OCI standards.
Explore the Architecture on Your Own Machine
These commands let you see each component for yourself:
Common Misconceptions About Docker Architecture
Frequently Asked Questions
What are the main components of Docker architecture?
The Docker client, the Docker daemon (dockerd), images, containers and registries. Underneath the daemon, containerd and runc create and run containers using Linux kernel namespaces and cgroups.
What is the difference between dockerd, containerd and runc?
dockerd is Docker's API server and coordinator, handling images, builds, networks and volumes. containerd manages container lifecycles and image content. runc is a small tool that actually creates each container according to the OCI runtime specification and then exits.
Can the Docker client and daemon run on different machines?
Yes. The client communicates with the daemon through an API, so it can manage a remote daemon over SSH or TLS. Docker contexts make switching between local and remote daemons easy.
Where are Docker images stored on Linux?
On fresh Docker Engine 29 installations, image content and snapshots are stored by containerd under /var/lib/containerd. Hosts still using the classic store keep image layers under /var/lib/docker. Volumes are stored under /var/lib/docker/volumes in both cases.
Is Docker Hub the only registry?
No. Docker Hub is the default registry, but Docker works with any OCI-compatible registry, including Amazon ECR, GitHub Container Registry, Azure Container Registry, Google Artifact Registry and self-hosted Harbor.
Why do I need Docker Desktop on Mac and Windows?
Linux containers need a Linux kernel. Docker Desktop provides one in a lightweight virtual machine and connects it seamlessly to the Docker client on your host.
Conclusion and Next Steps
Docker architecture is a clean chain of responsibilities. The client sends requests; the daemon coordinates images, networks, volumes and builds; containerd, shims and runc create and supervise containers; the kernel enforces isolation; and registries distribute images between machines. Knowing which link in the chain is involved turns vague Docker errors into specific, solvable problems.
Continue the Docker course with these tutorials on BitCodeMatrix:
What Is Docker? — the problems containers solve and why Docker became the standard
Docker Daemon Explained — a closer look at dockerd and its configuration
Container Isolation and Linux Namespaces — the kernel features behind every container
How to Install Docker on Ubuntu, Windows (WSL2) and macOS (Module 2) — put the architecture to work on your own machine