03 — Installation & Setup: Docker Desktop vs Docker Engine

6 min read

"Just install Docker" was my installation plan, and it blurred the two products that share the name until one of them stopped working. The separation that stuck: Docker Desktop is the all-in-one developer environment with a GUI and a managed VM underneath; Docker Engine is the bare container runtime you install directly on a Linux host. [1][4]

The distinction matters because the two target different users. Desktop is built for a developer at a laptop who wants everything working in ten minutes — daemon, CLI, Compose, BuildKit, even a single-node Kubernetes cluster, all behind one installer and one tray icon [2][3]. Engine is built for a server, where there's no GUI, no point in one, and the daemon should start on boot and stay out of the way [5]. Same docker command on both; very different bundles.

What's actually inside each one

Docker Desktop bundled dev environment Docker Engine runtime only GUI (Docker Desktop app) Engine CLI Compose k8s managed VM (Linux on macOS/Win) your laptop (macOS / Win / Linux) Docker daemon (engine) CLI Linux server one installer, everything bundled package manager, daemon only

The visual asymmetry is the point. Desktop is a tall stack because it carries a whole managed Linux VM — that VM is necessary on macOS and Windows, where there's no Linux kernel to share natively, so Desktop runs a lightweight VM to provide one [2]. Engine on a Linux server needs none of that; the kernel is right there.

Docker Desktop

Desktop is the recommended path for local development on macOS, Windows, and now Linux too [2]. One installer delivers:

  • Docker Engine — the daemon that actually builds and runs containers.
  • CLI — the docker command.
  • Docker Compose — multi-container orchestration from a YAML file.
  • Buildx — the modern image builder with caching and multi-platform support.
  • A single-node Kubernetes cluster — toggle it on in settings to test k8s manifests locally [2][3].
  • Extensions and a GUI — resource sliders (how much CPU/RAM the VM gets), image list, container logs, volume browser.

The thing I had to internalize: on macOS and Windows, Desktop is the VM. The containers are not running natively on my laptop's kernel; they're running inside the managed Linux VM Desktop spins up, and the GUI is just a window onto that VM [2]. That's why the resource settings matter — I'm carving out a slice of my laptop for the VM, and starving it slows every container.

Docker Engine

Engine is the same daemon, installed the old-fashioned way through a Linux distro's package manager, with no GUI and no managed VM because none is needed [4][5]. On a Linux server the kernel is native, so Engine talks to it directly. Installation is a few commands — add Docker's repo, install, start the service, enable it on boot. The classic sanity check:

sudo systemctl status docker
docker run hello-world

If hello-world prints its banner, the daemon is up, the CLI can reach it, and the runtime can pull and start an image [5]. That's the whole verification. Engine is what I want on every production host and every CI runner — Desktop's GUI and Kubernetes toggle would just be wasted RAM.

A note on Linux permissions

One detail that trips up every first-time Engine install: by default the docker command needs sudo, because the daemon socket is owned by root. The standard fix is to add my user to the docker group:

sudo usermod -aG docker $USER

After a re-login, docker ps works without sudo. This is convenient and it's also a security trade-off — members of the docker group effectively have root, because they can mount any host path into a container. Fine for a dev box; worth thinking twice about on a shared server.

Which one, and where

The way of thinking I use to pick:

  • My laptop (macOS or Windows) → Docker Desktop. There's no native Linux kernel, so I need the managed VM, and the bundled Compose/Kubernetes save me wiring them up.
  • A Linux dev machine → either works. Desktop gives the GUI; a plain Engine install is lighter. I take Engine on machines where I never open the GUI anyway.
  • A server or CI runner → Docker Engine, always. No GUI, no VM overhead, daemon managed by systemd.

The docker commands I type are identical in all three cases — that uniformity is the whole point of having one CLI across two products.

How I use this

The payoff is mostly about not being surprised. When a teammate on macOS says "Docker is slow," I now know to check Desktop's resource sliders — they've under-allocated the VM, and the containers are starved, not Docker itself being slow. When I provision a server, I reach straight for Engine and don't waste time looking for a GUI that doesn't belong there. And when a fresh Engine install complains about permissions, I remember the docker group and the security implication it carries. Naming the product I'm actually using is, again, most of the diagnosis.

References

[1] Docker, Inc., "Docker Desktop," docker.com, 2024. [Online]. Available: https://www.docker.com/products/docker-desktop

[2] Docker, Inc., "Docker Desktop documentation," Docker Docs, 2024. [Online]. Available: https://docs.docker.com/desktop/

[3] Docker, Inc., "Get Started with Docker," Docker Docs, 2024. [Online]. Available: https://docs.docker.com/get-started/

[4] Docker, Inc., "Install Docker Engine," Docker Docs, 2024. [Online]. Available: https://docs.docker.com/engine/install/

[5] Docker, Inc., "Docker Engine," Docker Docs, 2024. [Online]. Available: https://docs.docker.com/engine/

Knowledge check · Question 1 of 5

Why does Docker Desktop need a managed VM on macOS and Windows?

Comments

Leave a Comment

You must be signed in to comment

0 Comments

No comments yet. Be the first to comment!