Ship the environment, not just the code
'Works on my machine' is an environment problem: the code was fine, the surrounding libraries and versions differed. Containers attack exactly that. A build produces an image — a frozen snapshot of application plus environment — and any machine with a container engine (Docker made this mainstream) runs that image bit-for-bit identically: laptop, CI pipeline, production server. Deployment stops being 'install and configure' and becomes 'start this image'.
The isolation trick is what separates containers from a VPS: no hardware is virtualized and no guest operating system boots. Containers are isolated processes sharing the host's kernel, which makes them start in milliseconds and cost megabytes rather than gigabytes — and makes their isolation kernel-level, a notch weaker than a hypervisor's. In practice both layers combine: cloud virtual machines run fleets of containers inside.
One container is simple; fifty containers across ten machines are not. Orchestrators — Kubernetes above all — schedule containers onto machines, restart failures, roll out new versions and scale replicas. That power carries real operational complexity, which is why 'do we actually need Kubernetes yet?' is a legitimate architecture question, not a joke.
