01 · THE BASELINE
Know what you are replacing before you replace it.
Docker Desktop is not just the engine. It is a bundle, and the parts you never think about are the ones you have to reproduce.
- A managed Linux VM — on Windows, a WSL2 distribution that hosts the daemon and is kept updated for you.
- The engine and CLI, plus Docker Compose and BuildKit.
- Filesystem and port integration — bind mounts from Windows paths, and published ports reachable on localhost.
- A graphical interface for containers, images, volumes and logs.
- Credential helpers for registry authentication, wired into the Windows credential store.
- Optional Kubernetes, one checkbox away.
- Automatic updates of all of the above.
Licensing, in one line: Docker Desktop requires a paid subscription for commercial use in organisations above a published size and revenue threshold, and is free for personal use, education and small businesses. The thresholds have changed more than once — check the current terms rather than a summary in any guide.
02 · THE FIELD
Four replacements, sorted by how much you want to configure.
| Option | What it is | Best for | Trade-off |
|---|---|---|---|
| Podman Desktop | Daemonless, rootless container engine with a graphical interface | The closest drop-in replacement, with a real GUI and a Docker-compatible CLI | Rootless has genuine differences: low ports, some volume behaviour, a few compose edge cases |
| Rancher Desktop | Open-source desktop app over containerd or the Docker engine, with Kubernetes built in | Anyone who wants local Kubernetes without extra setup | Heavier than the alternatives; Kubernetes is the point rather than an extra |
| Docker engine in WSL2 | The engine installed directly inside a Linux distribution | Developers already living in WSL2 who want the lightest possible setup | No GUI, and you wire up startup, port access and Windows path mounts yourself |
| containerd with nerdctl | The underlying runtime plus a Docker-compatible CLI | Matching a production Kubernetes runtime exactly | The least hand-holding of the four |
For most people the choice is between the first and the third: Podman Desktop if you want something that feels like what you had, or the plain engine in WSL2 if you want the smallest number of moving parts and already work in a Linux shell all day.
03 · THE LEAN ROUTE
Install the Docker engine directly in a WSL2 distribution.
No desktop application, no background service on Windows, and the engine runs where your code already lives. Around ten minutes to set up.
# Install the engine and the compose plugin from Docker's repository
curl -fsSL https://get.docker.com | sh
# Run docker without sudo
sudo usermod -aG docker $USER
# Start it, and have it start with the distribution
sudo service docker start
echo 'sudo service docker start' >> ~/.bashrc
# Verify
docker run --rm hello-world
docker compose version
Details that matter afterwards
- Enable systemd in
/etc/wsl.confif you want the daemon managed properly rather than started from your shell profile. Restart withwsl --shutdownafterwards. - Keep project files in the Linux filesystem. Bind-mounting from
/mnt/cis slow for the same reason every other cross-boundary operation is slow. - Published ports are reachable from Windows on localhost with mirrored networking enabled, which the WSL2 guide covers.
- Your editor still works. VS Code connected to WSL sees the daemon exactly as a Linux machine would.
04 · THE DROP-IN
Podman, if you want the graphical experience back.
Podman is daemonless and rootless by default, which is a security improvement and the source of every difference you will notice.
winget install RedHat.Podman
# Or install Podman Desktop for the graphical interface
# Create and start the backing Linux machine
podman machine init
podman machine start
podman run --rm hello-world
# The Docker-compatible alias, if you want muscle memory to keep working
Set-Alias docker podman
The four differences that catch people
- Ports below 1024. Rootless containers cannot bind them directly. Publish to a high port and map it, or use the documented privileged-port configuration.
- File ownership in volumes. User namespace mapping means a file written in a container may not have the UID you expect on the host. The
:Uand:Zvolume options exist for exactly this. - Compose. Podman supports Compose files through
podman composeor a socket-compatible mode, but a few edge cases in networking and dependency ordering behave differently. Test the whole stack before switching a team. - Pods are first class. Podman can group containers into a pod that shares a network namespace, which is closer to Kubernetes semantics and genuinely useful once you know it exists.
A Docker socket compatibility layer exists for tools that talk to the Docker API directly, such as Testcontainers or some IDE integrations. Enable it before concluding that a tool is incompatible.
05 · MIGRATION
Seven things to check before you uninstall.
Named volumes do not migrate between engines. Export any database data you care about before removing anything.
Private registry logins live in the Desktop credential helper. Have the credentials to hand before you lose access to it.
Run the whole stack on the new engine before committing. Networking and dependency ordering are where differences show.
Testcontainers, IDE integrations and some CI runners talk to the Docker API directly. Point them at the compatibility socket.
If you build ARM images on x86, verify the emulation setup exists on the new engine before you need it.
If you used the Desktop checkbox, decide on a replacement: Rancher Desktop, kind, k3d or minikube.
Remove Desktop through Windows Apps, then clean up its WSL distributions so they stop consuming disk.
wsl -l -v
wsl --unregister docker-desktop
wsl --unregister docker-desktop-data
Unregistering deletes everything in that distribution. Any volume you have not exported is gone. Do the export first, and confirm you can read it back.
06 · THE HONEST CASE
Three situations where Docker Desktop is still the right answer.
- A team where not everyone is a container specialist. The graphical interface, the automatic updates and the single supported path are worth real money in support time. Replacing it means someone owns the setup documentation.
- Personal use, where it is free. If you are under the licensing threshold, the licence argument does not apply to you at all, and the alternatives are a preference rather than a requirement.
- A workflow that depends on the ecosystem. Extensions, Docker Scout, and tight integration with tooling that expects Desktop specifically.
The resource argument is weaker than it used to be. Modern Desktop releases idle far more cheaply than the versions that gave it a reputation, and a properly configured .wslconfig caps its memory the same way it caps everything else in WSL. Measure your own machine before switching on that basis alone.
07 · QUICK ANSWERS
Containers without Docker Desktop, briefly.
Docker Desktop is free for personal use, education and small businesses, and requires a paid subscription for commercial use in organisations above a published size and revenue threshold. Those thresholds have changed more than once, so check the current terms directly rather than relying on any summary.
Podman Desktop. It provides a graphical interface, a Docker-compatible command line and a socket compatibility layer for tools that call the Docker API. The main differences come from being rootless: binding ports below 1024, volume file ownership, and a few Compose edge cases.
Yes, and it is the lightest option. Install the engine and the Compose plugin inside a WSL2 distribution, add your user to the docker group, and start the service. You lose the graphical interface and automatic updates, and you configure startup and port access yourself.
Mostly. Podman supports Compose files through podman compose or a Docker-compatible socket, but networking behaviour and dependency ordering have edge cases that differ. Run your full stack on the new engine before switching a team, rather than testing a single container.
You export and re-import the data rather than moving the volume. Run a temporary container that mounts the volume, write its contents to an archive on the host, then restore it into a new volume on the new engine. Named volumes are not portable between engines directly.