Dockerfiles and Compose 514 files work unchanged on Engine, so moving from Desktop is about data and conveniences:
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.
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.
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).
Contexts. Replace Desktop's desktop-linux context with default (unix:///var/run/docker.sock).
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:
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.internalnot 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.