Why Docker, Kubernetes, and Podman beat endlessly spinning up VMs
Nathan Chadwick · · 7 min read
TLDRRead the short version
- Cloning a VM for every idea burns evenings. Containers make the unit of work the app and its dependencies rather than a whole operating system.
- The wins are speed, density, repeatable Compose or Containerfile recipes, cleaner upgrades by pulling a new tag, and portability across laptop, lab, and cloud.
- Image registries like Docker Hub and GHCR turn building a server into composing a stack.
- Real trade-offs: shared kernel isolation, stateful volumes and restore tests, networking learning curve, image supply chain, and Kubernetes complexity. Some workloads still belong in VMs.
- Start small: containerise one service, put its data on a volume, write a Compose file, then destroy and rebuild it.
Stop cloning VMs for every idea. Start shipping containers.#
There is a particular kind of home-lab and ops fatigue that only VM people know.
You want to try a new dashboard. Or a reverse proxy. Or a database for a weekend project. So you clone a template, wait for cloud-init, patch the guest OS, install packages, open ports, take a snapshot "just in case", and somehow burn an evening before the app even starts. Multiply that by every experiment and your hypervisor becomes a graveyard of almost-useful machines.
Containers flip that workflow.
With Docker, Podman, and orchestration like Kubernetes (or lighter options such as Compose, Swarm, Nomad, or k3s), the unit of work stops being "a whole operating system" and becomes "the app and its dependencies, packaged once, run anywhere." That sounds like marketing until you feel the speed difference in your own lab.
Why containers beat endless VM sprawl#
A virtual machine virtualises hardware. You get strong isolation and a full guest OS, which is still the right tool for some workloads. A container virtualises the process space on a shared kernel. That smaller boundary is the whole point.
Faster to start#
Containers usually boot in seconds, not minutes. That changes behaviour. You experiment more. You tear things down more. You stop treating every service like a pet that must live forever.
Smaller and denser#
One host can run dozens of containers comfortably where a handful of full VMs would already feel heavy. For home labs on a NUC, mini PC, old Dell, or a single Proxmox box, density matters. More services. Less RAM tax. Less disk bloat from duplicated guest operating systems.
Repeatable by default#
A Dockerfile or Containerfile is a recipe. A Compose file is a lab diagram in text. Recreate the stack on another machine and you get the same shape, not "close enough if I remember what I installed six months ago."
Cleaner upgrades#
Need a new major version of Postgres, Nginx, Grafana, or Home Assistant? Pull a newer image, recreate the container, keep the volume. Compare that with in-guest package archaeology across five VMs that all drifted in slightly different ways.
Portable across environments#
Dev laptop, home server, cloud VM, CI runner: same image pattern. That portability is why containers ate application hosting. It is also why they are brilliant for labs that outgrow one machine.
The move to containerisation, and why it stuck#
Containers won because they matched how modern software is built:
- Apps are dependency-heavy
- Teams want identical environments
- Releases happen often
- Horizontal scale beats vertical hero boxes
- Infrastructure as code beat tribal knowledge
Docker made the packaging story mainstream. Podman gave many operators a daemonless, rootless-friendly alternative with familiar commands. Kubernetes became the control plane for running containers at fleet scale: scheduling, health checks, rolling updates, service discovery, secrets, and self-healing.
You do not need Kubernetes on day one at home. Many people get enormous value from Docker Compose or Podman Quadlets first. The important shift is mental: declare the service, attach storage and network, recreate freely.
Image hubs: an app store for infrastructure#
One of the most compelling parts of the container world is that you rarely start from zero.
Trusted and widely used registries include:
- Docker Hub for popular community and official images
- GitHub Container Registry (GHCR) for project-native images
- Quay and vendor registries for enterprise and specialist images
- Cloud registries (ECR, ACR, GCR/Artifact Registry) when you want private, close-to-compute storage
- Your own registry for air-gapped or highly controlled labs
Want Nginx? Postgres? Redis? Pi-hole? Immich? Authentik? A reverse proxy stack? In many cases it is:
docker pull postgres:16or the Podman equivalent, then run it with mounts and environment variables. Official images and well-maintained community images turn "build a server" into "compose a stack."
That ecosystem is the hidden productivity unlock. VMs give you blank machines. Container hubs give you packaged capabilities.
Updates that feel sane#
Good container practice makes patching boring in the best way:
- Pin versions in Compose or manifests (
image: grafana/grafana:11.2.0) - Watch release notes
- Pull the new tag
- Recreate the service
- Keep persistent data on volumes
- Roll back by pointing at the previous tag if needed
Kubernetes takes this further with rolling updates and health probes: replace pods gradually, watch readiness, abort if the new version is unhealthy.
Compare that with golden images, sprawling VM templates, and "I'll patch it later" guests that silently diverge. Containers do not magically remove change risk. They make change small, reversible, and scriptable.
The difficulties nobody should skip#
Containerisation is great. It is not free.
Shared kernel means different isolation assumptions. A breakout is a different class of problem than escaping a hypervisor. Rootless mode, user namespaces, seccomp, AppArmor/SELinux, and least privilege matter.
Stateful services need discipline. Databases and media libraries live or die by volumes, backups, and restore tests. Ephemeral containers plus forgotten bind mounts is a painful lesson.
Networking can confuse people at first. Bridge networks, published ports, reverse proxies, DNS between services, and later ClusterIP/Ingress in Kubernetes all have learning curves.
Image supply chain is a real risk. Pulling latest from a random account is not a strategy. Prefer official images, pin digests for critical services, scan images, and mirror what you depend on.
Not every workload belongs in a container. Desktop GPU passthrough oddities, full Windows domain controllers, nested virtualisation labs, and some appliance-like systems may still be happier as VMs.
Kubernetes complexity is real. It scales beautifully and can also become a second full-time hobby. Start with Compose/Podman if your goal is a joyful home lab, then grow into k3s/k8s when the pain of hand-managing many hosts shows up.
Honesty makes the case stronger: containers win because the trade-offs are usually worth it, not because there are no trade-offs.
Where they scale absurdly well#
This is the part that makes containers feel inevitable.
Need 1 instance of an API? Run one container. Need 30 for a load test? Scale the service. Need zero overnight? Scale to zero in some platforms, or just stop the compose project.
Kubernetes formalises that:
- Replica counts instead of cloning VMs
- Rolling deploys instead of weekend cutovers
- Health checks instead of hoping the process stayed up
- Node failure tolerance instead of single-box faith
- Declarative desired state instead of snowflake servers
Even at home, the same ideas help. One compose stack for media. One for identity. One for monitoring. Rebuild a machine and bring the stacks back without reconstructing tribal install notes from chat logs.
Why containers are brilliant for home labbing#
Home labs used to mean "how many VMs can this box endure?" Now they mean "how many useful services can I run cleanly?"
Containers excel here because:
- Experiments are cheap to start and easy to delete
- You can keep production-ish habits without enterprise cost
- Backups focus on volumes and config, not giant disk images for every toy service
- You can learn real cloud patterns on hardware you already own
- Podman or Docker on Proxmox/LXC/bare metal gives flexible layering: VMs where isolation demands it, containers where speed and density win
A compelling home-lab setup often looks like this:
- Hypervisor or host OS underneath
- Docker or Podman for most apps
- Compose/Quadlets for tidy stacks
- Optional k3s when you want clustering, ingress, and self-healing
- Local or remote registry mirror for reliability
- Watchtower/Diun/renovate-style update awareness, plus deliberate promotion rather than blind auto-latest everywhere
That combination gives you playground velocity without turning every idea into another 20 GB guest OS.
The compelling bottom line#
Continuously spinning up VMs trains you to treat software like livestock that needs a farm each time. Containers train you to treat software like packaged units: pull, run, update, discard, scale.
Docker made that accessible. Podman made it flexible for security-conscious operators. Kubernetes proved it could run the planet's platforms. Image hubs turned the internet into a warehouse of ready-made building blocks.
Yes, you must learn networking, storage, and image trust. Yes, VMs still deserve a seat for strong isolation and certain OS-level labs. But if your days are disappearing into clone-patch-configure-repeat, containerisation is not a trend to tolerate. It is the workflow upgrade that gives you your evenings back and lets your infrastructure finally move at the speed of your curiosity.
Start small. Containerise one service you currently run in a VM. Put its data on a volume. Write a Compose file. Destroy it and bring it back from scratch. That moment, when rebuild becomes routine instead of a project, is usually when people stop asking whether containers are worth it.
References#
Sources and further reading for the claims above.