Docker

What a quote is telling you when it says Docker

The short answer

Docker packages an application together with everything it needs to run, so the same bundle behaves the same way on a developer's laptop and on a server. It isn't hosting and it isn't a language. It makes deployment repeatable, and it adds one more layer somebody on the project has to understand.

There's a line in your proposal about Docker, filed somewhere near hosting, and it isn't hosting. It's packaging. That sounds like hair-splitting until you see what it changes about how software gets from somebody's laptop onto the internet, which is where projects quietly lose days.

It's packaging, and packaging isn't hosting

A container is an application bundled with everything it needs to run. Not just your code: the language version it expects, the libraries it depends on, the settings, and the command that starts it, sealed into one thing machines can copy.

The seal is the point. That same bundle runs on a developer's laptop, on the machine that tests it, and on the server the public reaches. Nothing gets set up differently at each stop, because nothing gets set up at each stop.

So Docker sits oddly in a quote, usually filed under hosting. You still rent a machine to run the thing on. What changes is what gets handed to it: a sealed bundle instead of a pile of files and instructions somebody follows by hand.

Three words do most of the work. A Dockerfile is the recipe. An image is what building that recipe produces. A container is one running copy of an image.

  1. 01

    Dockerfile

    A short text file listing what the application needs. It lives with the code, so the setup is version-controlled like everything else.

  2. 02

    Image

    Building the recipe produces a sealed bundle. Everyone who pulls it gets the same bytes, today and in two years.

  3. 03

    Registry

    The image gets pushed to a store, private or public, that your servers and your build system pull from.

  4. 04

    Running container

    A machine pulls the image and starts a copy. Start it again anywhere and you get the same thing, not a similar thing.

How code becomes something a server can run: a recipe file, a sealed image built from it, a store the image is pushed to, and identical running copies pulled back out.

The problem it was built to solve

Before containers, putting an application on a server meant recreating a developer's setup by hand. Install the language, the right version, the libraries, the configuration. Then do it again on the next server, and again when somebody new joined.

Every step was a chance for two machines to end up slightly different, and slightly different was enough. Code that ran on a laptop failed on the server over a library version nobody had written down. "Works on my machine" became a joke because it happened constantly.

Docker turned that setup into a file. One that gets built, checked in beside the code and reproduced exactly on demand. Nearly everything else containers are good at follows from that.

Docker was released in 2013, and containers are now an ordinary part of how applications get shipped. That matters practically rather than fashionably: whoever inherits your project next will recognise what they've been handed.

What it's genuinely good at

Repeatability, which sounds dull and is the whole value. The image that passed testing is the image that goes live, so "what's different about production" stops having an answer. Rolling back gets cheap too, because the previous image still exists and going back means running it again.

It also shortens the first day for anyone new. A developer clones the project and starts it, and the database comes up alongside it without being installed on their machine. That turns a setup checklist into a single command.

Where it stops

Containers make deployment repeatable. They don't make software good, fast or safe. A slow database query is just as slow inside a container, and packaging a badly built application means you can now deploy it reliably.

The one that catches people is that containers are disposable on purpose. A running container gets thrown away and replaced on every deploy, and whatever was written inside goes with it. Your database, your uploaded files, anything you mean to keep, all of it lives outside the container.

Then there's the layer itself, which somebody has to understand. When a page stops working, the fault could now be the code, the image, the settings passed into the container, or the network between two containers that can't see each other. That's a real skill, and it isn't the skill of writing the application.

Plenty of applications ship perfectly well without any of this. A small site on a platform that builds and runs your code for you already gets most of the repeatability, and the layer stays somebody else's problem. Containers earn their place when you want that guarantee under your own control.

Kubernetes is a separate decision, and a far bigger one

Containers on one machine are simple enough. You start them by hand, or with a short file describing a few of them running together, and plenty of businesses never need more.

Running them across many machines is different work. Something has to decide what runs where, restart whatever dies, release a new version without dropping requests, and move load when a machine disappears. Kubernetes does all of that and it's the standard tool for it, with its own vocabulary, failure modes and upgrade cycle.

It isn't the natural next step after Docker, it's a different commitment. It earns its place when traffic genuinely outgrows one machine, or when downtime during a release costs more than a cluster does. Below that, you've taken on an operations job for a problem you don't have yet. Containers make a cluster possible later anyway, so starting small doesn't close the door.

Containers, one machine

Kubernetes cluster

What's running

Containers, one machine: One machine you can name. If it stops, the site stops.

Kubernetes cluster: Several machines, plus a system deciding what runs where. More parts that can be wrong.

Who operates it

Containers, one machine: A developer who knows the application. One page of commands, and usually one person who knows them.

Kubernetes cluster: Somebody who knows the cluster and is reachable. That's a role, not a task.

Releasing a version

Containers, one machine: Swap the image and restart, with a short gap where the site is down.

Kubernetes cluster: Replaced gradually with no gap, once the health checks are set up correctly.

Getting it wrong

Containers, one machine: You outgrow it and migrate later, with the application already packaged.

Kubernetes cluster: You pay for the machines and the attention while the traffic stays small.

Containers on one machine against a Kubernetes cluster, and what each one costs: simplicity paid for in downtime and a ceiling, or resilience paid for in expertise and attention.

Who has to be around afterwards

None of this is technical, and it rarely appears in a proposal.

Somebody has to own the file that builds the image. It starts from a base image other people maintain, and that base gets security updates. Nothing rebuilds yours on its own, so staying current means a scheduled rebuild rather than a reaction to something going wrong.

Somebody also has to be reachable when a deploy fails at an awkward hour. On one machine that's a developer who knows the application. On a cluster it's somebody who knows the cluster.

If the honest answer to who does this in year two is that nobody has thought about it, settle that before settling the platform.

Worth knowing before you start

  • Ask where the data lives when a container is replaced. If any part of the answer is inside the container, ask again. Containers get rebuilt and discarded routinely, and whatever was written inside goes with them.

  • Ask to watch somebody set the project up on a machine that has never run it. A short documented sequence and a running application is what containers are for. If it still takes a day and a checklist, the packaging isn't doing its job.

  • Ask which base images the build starts from and who rebuilds them when a security update lands. This is the maintenance that gets skipped, because nothing visibly breaks when you skip it.

  • If Kubernetes shows up in a proposal, ask what specifically fails without it. Traffic beyond one machine, or releases that can't drop requests, are real answers. Being the standard isn't.

  • Check that the recipe for building the image lives in your code repository, not on one person's laptop. If the only record of how the application is assembled can walk out, you've taken the extra layer and none of the benefit.

Common questions

No. Docker is how the application gets packaged. You still rent something to run it on: a server, a cloud service, or a platform that takes a container and runs it. Docker decides what gets handed to that machine, not who you pay for it.

No, and on a normal web application it doesn't make it slower in any way you'd notice either. What changes is how reliably it starts and how repeatable a deploy is. Speed comes from the code, the database and the hosting.

The engine that runs containers on a server is open source and free. Docker Desktop, the app developers use on Macs and Windows machines, needs a paid subscription above a company-size threshold Docker publishes and has changed before, so check the current terms. The costs that decide a budget are the hosting and the maintenance.

Almost certainly not at the start. Most businesses run containers on one machine, or hand an image to a hosting platform that runs it for them. Kubernetes is for many containers across many machines, and it's as much an ongoing job as a tool.

Less than with most tooling choices. The image format is an open standard and other tools build and run the same images, so an image isn't tied to one company. Leaving containers entirely would mean redoing the deployment setup, not the application.

Related

Want to talk through your situation?

A short call is usually enough to tell whether this is the right work for you. If it isn’t, we’ll say so.