Packaging an application with its dependencies, and orchestrating the result across machines.
Containers package an application together with its runtime and libraries so it runs the same way on a laptop, a CI runner and a production cluster. Docker builds and runs individual containers; Kubernetes schedules and manages many of them across a fleet of machines.
A container image is a stack of read-only filesystem layers plus metadata (entrypoint, environment, exposed ports). A container is a running instance of that image, isolated with Linux namespaces and limited with cgroups. It shares the host kernel, which is why containers start in well under a second and use far less memory than virtual machines.
Docker is enough when you run one or a few containers on a single host, for local development, CI jobs, or a small service managed with Docker Compose. Once you need scheduling across many machines, self-healing, rolling updates, service discovery, autoscaling and declarative configuration, you move to an orchestrator; Kubernetes is the standard choice, available as managed services such as EKS, GKE and AKS.
| Concern | Docker / Compose | Kubernetes |
|---|---|---|
| Scope | Single host | Cluster of nodes |
| Failure handling | Restart policy | Rescheduling, health probes |
| Scaling | Manual | Horizontal Pod Autoscaler |
| Learning curve | Low | High |
Start with Key Points about Docker for images, layers and the build/run workflow, then Kubernetes Overview for the control plane, worker nodes and pods. Container images are the usual output of a CI/CD pipeline.
latest, which makes deployments non-reproducible; tag with a version or commit SHA.