Docker is a toolchain for building, distributing and running containers, and most of the value engineers get from it is decided at build time rather than run time. A Dockerfile is compiled by BuildKit into a graph of steps whose results are cached by content, which means the ordering of instructions is a performance decision: put the line that changes on every commit above the dependency install and every build reinstalls dependencies. Multi-stage builds separate the toolchain that compiles an artifact from the runtime that ships it, which is how a build image of two gigabytes becomes a runtime image of eighty megabytes.
The image itself is a stack of content-addressed layers plus a configuration blob describing the entrypoint, environment, user, exposed ports and healthcheck. Because it is content-addressed, the same image can be verified, signed and promoted between environments without rebuilding — the artifact that passed testing is bit-for-bit the artifact that reaches production. Registries such as Docker Hub, Artifactory, Nexus, ECR and ACR move those images, and a pull-through cache in front of a public registry is what keeps a build farm working when the upstream is slow or rate limited.
At run time, a container is an ordinary process with a restricted view: namespaces partition what it can see, cgroups cap what it can consume, capabilities and seccomp limit what it may ask the kernel to do. That has consequences people meet the hard way — the process runs as PID 1 and must handle signals or shutdown will hang; a memory limit is enforced by the kernel and the runtime inside must be told about it; storage is ephemeral unless a volume says otherwise; and stdout, not a log file, is where output belongs. Understanding where Docker ends and containerd, runc and the kernel begin is what makes those failures debuggable rather than mysterious.
Why this skill matters now
Containers stopped being a differentiator and became a baseline, which paradoxically raised the skill bar. When only pioneers used Docker, a working image was an achievement. Now every deployment target — Kubernetes, ECS, Cloud Run, a serverless container platform — assumes an image exists, so the interesting questions have moved downstream: how large is it, how long does it take to build, what is inside it, who signed it, and does it behave when the orchestrator sends SIGTERM.
Supply chain expectations pushed hardest. A base image is now something an organisation governs rather than something a developer picks, because every vulnerability in it multiplies across hundreds of services; scanning, provenance, signing and a bill of materials have gone from optional to contractual in regulated sectors. Build performance became the second pressure, since a build that takes twenty minutes and cannot use a cache is paid for on every commit by every engineer.
The third change is architectural. Fleets are increasingly mixed between x86 and ARM — laptops on Apple Silicon, cost-driven migration to ARM instances in the cloud — and images that were never built for more than one platform break in ways that are hard to attribute. So the skill in demand is not 'can you write a Dockerfile' but 'can you produce a small, reproducible, scannable, multi-architecture image that behaves correctly under an orchestrator', which is a genuinely different capability.