Leaving Docker Desktop

Migrating a Desktop-Based Workflow to Engine-Only

Dockerfiles and Compose 514 files work unchanged on Engine, so moving from Desktop is about data and conveniences:

  1. Images. Rebuild or re-pull them where possible. For images that exist only locally, docker save -o images.tar name:tag ... on Desktop and docker load -i images.tar on Engine carry them over.

  2. Volumes. Named volumes live inside Desktop's VM. Archive each through a throwaway container: docker run --rm -v booknest-pgdata:/data -v "$PWD":/backup alpine:3 tar czf /backup/pgdata.tgz -C /data ., then run the reverse (tar xzf) into a new volume on Engine. For PostgreSQL 1,289 , a pg_dump is safer still.

  3. Credentials. Desktop's ~/.docker/config.json names its own credential helper ("credsStore": "desktop.exe" on Windows). Delete that line, or install docker-credential-pass, then docker login again (Image Registries).

  4. Contexts. Replace Desktop's desktop-linux context with default (unix:///var/run/docker.sock).

  5. Host access. Desktop defines host.docker.internal for every container; Engine adds it only on request.

The last point breaks the most migrations. Engine's special value host-gateway supplies the address:

host.docker.internal on Docker EngineShell
docker run --rm alpine:3 getent hosts host.docker.internal || echo "not defined (exit $?)"
docker run --rm --add-host host.docker.internal:host-gateway alpine:3 \
  getent hosts host.docker.internal
Output
not defined (exit 2)
172.17.0.1        host.docker.internal  host.docker.internal

host-gateway resolves to the default bridge's gateway, 172.17.0.1, the host as seen from containers. In Compose it is extra_hosts: ["host.docker.internal:host-gateway"]. Finally, uninstall Desktop, or turn off its WSL 6 integration for the distribution, so that only one daemon answers the docker command.