04OPERATOR’S DIARY
A container earns its keep long before Kubernetes does.
When someone asks whether they should "use Docker or Kubernetes", they have usually folded two decisions into one. The two belong apart. One of them pays off the day you make it and asks almost nothing in return. The other is a real commitment that most teams take on a year too early. Getting the order right is most of the value, so I want to pull them back apart.
A container packages an application together with everything it needs to run: its libraries, its runtime, its configuration. The result is a single image that behaves the same wherever you start it.¹ That is the whole idea and it is a small one, which is exactly why it is easy to overcomplicate what comes next.
01The win that arrives on day one.
The reason to containerise is reproducibility and it shows up immediately. A commit triggers a build that produces one image. That same image is what runs in the test suite, what a colleague pulls onto their laptop and what gets promoted to production, unchanged. The old "it works on my machine" gap simply closes, because there is only ever one machine in a meaningful sense: the image. Nothing about that requires a cluster, an orchestrator or a single line of cloud-native vocabulary. It works on one server.
This is the part I want operators to take seriously, because it is the part that quietly delivers. A continuous-integration pipeline built around a container is honest in a way that a pipeline built around "deploy the latest code to the server" never quite manages. The artefact you tested is, byte for byte, the artefact you shipped. When something breaks at two in the morning, you are debugging a known thing rather than a subtly different thing that happens to share a git history with what you tested. That confidence is the dividend and you collect it on the first deploy.
02Docker and Kubernetes, different layers.
So where does Kubernetes come in and why does the question keep arriving as "Docker or Kubernetes"? The framing is a category error. Docker is the everyday tooling you use to build an image and run a container. Kubernetes is an orchestrator: it takes many containers across many machines and keeps them running, scaled, routed to and healed when one falls over. The first is how you package and start a thing. The second is how you coordinate a fleet of those things. They are not rivals any more than a shipping container competes with a port.
It helps to notice that the packaging layer is not even a single vendor's product. The image and runtime formats are an open standard, maintained by the Open Container Initiative under the Linux Foundation and implemented by containerd, Podman and BuildKit as much as by Docker.² The thing you package into is a format, not a trap. A container you build today runs on whatever runtime or cloud you choose tomorrow, which is the opposite of lock-in. The enemy worth avoiding is being unable to leave. An open artefact you can run anywhere is one of the cleaner ways to stay free to move. We hold our own work to the same line: what we build for a client is theirs to take and run elsewhere; containers are part of how we make that promise real rather than rhetorical.
03Do you need an orchestrator yet?
Once the layers are separated, the real decision comes into focus and it is not "which tool" but "do I need an orchestrator yet". Kubernetes is genuinely powerful: horizontal scaling on demand, self-healing when a node dies, rolling deploys with no downtime, service discovery and routing across a fleet. Those are real capabilities and on the right system they are worth a great deal. The catch is that Kubernetes is itself a distributed system you now own. You run it, patch it, secure it and stay on call for it. You pay that cost whether or not the workload underneath is large enough to need any of what it offers.
A fleet worth coordinating. Scaling, healing and zero-downtime rollouts stop being luxuries and start paying for the platform you run to get them.
One image on a managed runtime or a single good server. Fewer moving parts to secure, a smaller surface to document and the orchestrator still there the day you need it.
Cloud-native ways of working are genuinely mainstream now, which is part of what makes the pull so strong: a quarter of teams already reach for them on nearly all of their development and deployment.³ That is good news for the ecosystem and it is also the moment to keep your head. Mainstream tooling invites you to adopt its heaviest expression by default and the heaviest expression of cloud-native is a cluster you did not yet have a reason to run. Reaching for it early does not make a system more mature. It makes it more expensive to operate while it waits to grow into the capacity you bought.
Containerise on day one; reach for Kubernetes the day the workload actually asks for it.
04How we actually decide.
One engagement makes the shape of this concrete. A client in a regulated sector, a handful of services, a system that mattered and an audit that would eventually read every line of how it ran. We containerised everything from the first commit: every service an image, every deploy reproducible, the pipeline reassuringly boring. And we ran those images on a managed container service rather than Kubernetes for the better part of two years. Nothing about the size of the system justified an orchestrator and the simplicity was a feature in its own right: fewer moving parts to secure, a smaller surface to explain to the auditors, less standing between a change and production.
The day it flipped was just as concrete. The service count crossed the point where coordinating deploys by hand got fiddly, traffic became spiky enough that automatic scaling and self-healing were worth real money and a second team needed to ship without colliding with the first. At that point Kubernetes stopped being overhead and started paying for itself and the migration was almost dull precisely because the workloads were already containers. The early decision had made the later one cheap. That is the whole argument in one project: do the small reproducible thing immediately and the big decision stays easy and reversible for as long as you need it to.
The reason I like this order is that it keeps every door open. Containerise early and you have given up nothing while gaining a pipeline you can trust and the orchestrator is still waiting the day the system genuinely outgrows a single host. There is no rewrite involved, just a new place to run the same artefacts. The mistake is never "we containerised too soon". It is reaching for the heaviest tool first and mistaking the complexity for progress. Build the thing so it runs the same everywhere, then let the system tell you when it has outgrown its first home. In my experience it says so plainly and by the time it does the hard part is already behind you.
QUESTIONS ON THIS PIECE
What readers tend to ask.
01What is the difference between Docker and Kubernetes?
They sit at different layers and do not compete. Docker is the everyday way to build and package an application into a container image and run it. Kubernetes is an orchestrator: it runs and coordinates many containers across many machines, handling scaling, self-healing, rollouts and service routing. You almost always meet Docker first; you reach for Kubernetes only once you have a fleet of containers worth coordinating.
02Do small teams need Kubernetes?
Usually not yet. A container running on a single server or a managed container service carries a small team a long way, with far less to operate, patch and secure. Kubernetes earns its place once you have many services, more than one team deploying and traffic that needs automatic scaling and self-healing. Adopting it earlier than that means paying the complexity cost on capacity you are not using.
03Why containerise for CI/CD?
Because a container is a single, reproducible artefact. A commit triggers a build that produces one image; that exact image is tested in CI and promoted to production unchanged. The old "works on my machine" gap disappears: it runs the same on a laptop, in the pipeline and in production. That reproducibility is the real payoff of containers and it arrives on a single server with no orchestrator anywhere.
04Are containers tied to Docker?
No. The image and runtime formats are an open standard maintained by the Open Container Initiative under the Linux Foundation, built by tools such as containerd, Podman and BuildKit as well as Docker. The thing you package into is a format, not a product you are locked into, so a container you build today will run on whatever runtime or cloud you choose tomorrow.
SOURCES
- A container packages an application with its dependencies into a single image that runs consistently across environments: Docker, container overview. ↩
- The container image and runtime formats are open standards maintained by the Open Container Initiative under the Linux Foundation (Runtime, Image and Distribution specifications). Kubernetes is an open-source system for automating deployment, scaling and management of containerised applications: Kubernetes documentation. ↩
- Cloud-native techniques are now mainstream, with roughly a quarter of respondents using them for nearly all development and deployment: CNCF Annual Survey 2024. ↩