1. Peça ao Docker os totais dele
Comece sempre por aqui. Ele separa imagens, contêineres, volumes e cache de compilação, e diz quanto de cada um dá para recuperar.
docker system df -v
O Docker Desktop guarda tudo em um arquivo. Ele cresce a cada compilação, e apagar imagens não o deixa menor. Aqui está o porquê, e o que de fato recupera o espaço.
Grátis para baixar e escanear. Limpar exige uma licença: um pagamento por computador, Mac ou Windows.

No Mac, o Docker Desktop guarda tudo dentro de uma máquina virtual Linux, e o disco inteiro dessa máquina é um único arquivo esparso:
~/Library/Containers/com.docker.docker/Data/vms/0/data/Docker.raw
Confira o tamanho real em disco — não o lógico, que é sempre o máximo que você permitiu ao Docker:
du -h -d0 ~/Library/Containers/com.docker.docker/Data/vms/0/data/
Apague uma imagem e o espaço é liberado só dentro da máquina virtual. O arquivo no seu Mac continua do tamanho que estava, porque o macOS já entregou esse tanto a ele. Versões recentes do Docker Desktop emitem TRIM de dentro da VM, o que permite ao macOS recuperar os blocos liberados, mas isso acontece no ritmo do Docker, e não no momento em que você roda o prune. Até lá, docker system df informa gigabytes liberados enquanto o Finder não mostra mudança nenhuma.
Em ordem: do menos destrutivo ao mais.
Comece sempre por aqui. Ele separa imagens, contêineres, volumes e cache de compilação, e diz quanto de cada um dá para recuperar.
docker system df -v
Numa máquina que compila imagens com frequência, esse costuma ser o maior item e o mais seguro de remover: só deixa a próxima compilação mais lenta.
docker builder prune -a
Contêineres parados, imagens órfãs e redes sem uso:
docker system prune
Acrescente -a para remover também toda imagem que nenhum contêiner em execução use — o que significa baixá-las de novo depois. Só acrescente o próximo --volumes se tiver certeza: nos volumes é onde os bancos de dados guardam seus dados, e esse é o único comando desta página que destrói algo que você não consegue baixar de novo.
Veja o que sumiria de verdade:
docker volume ls
docker volume ls -f dangling=true
Depois do prune, o Docker Desktop tem um jeito previsto de devolver os blocos liberados: Ajustes → Recursos → Avançado → Uso de disco, ou sair e reabrir o Docker Desktop, o que dispara o TRIM na inicialização. Dê um minuto e confira o tamanho do arquivo de novo antes de decidir que não funcionou.
Em Ajustes → Recursos, o limite de disco virtual é o quanto o Docker.raw pode crescer. Baixá-lo não libera nada sozinho, mas põe um teto no problema. Tê-lo aumentado «por via das dúvidas» é o motivo de o arquivo ter chegado a 64 GB.
Ajustes → Solução de problemas → Clean / Purge data reinicia por completo o disco da máquina virtual e devolve o arquivo a quase zero. Apaga toda imagem, contêiner e volume que você tem. Use quando nada mais funcionou e você sabe o que há nos seus volumes.
Não apague o Docker.raw pelo Finder. Não é um arquivo de cache: são os dados de toda a instalação do Docker, e removê-lo com o Docker em execução pode deixar a máquina virtual num estado que vai exigir um reset de qualquer jeito.
No Mac em que o Docker chegou a 50 GB, o DerivedData do Xcode e os modelos de IA locais costumam vir logo atrás. Se você vai recuperar espaço, vale medir o disco inteiro uma vez em vez de consertar uma coisa de cada vez. A lista completa
No Linux o Docker grava direto em /var/lib/docker, então um prune libera o espaço na hora e nada do problema de TRIM acima se aplica. Limpeza de disco no Linux
Não pelo Finder, e não com o Docker em execução. Esse único arquivo é toda imagem, contêiner e volume que você tem. Se quiser mesmo começar do zero, use Solução de problemas → Clean / Purge data no Docker Desktop, que faz o mesmo de um jeito que o Docker conhece.
Porque liberou 20 GB dentro do sistema de arquivos da máquina virtual, não no seu Mac. O arquivo mantém o tamanho até o TRIM rodar e o macOS reaver os blocos. Sair e reabrir o Docker Desktop costuma disparar isso.
Só se você acrescentar --volumes. Sem essa opção ele deixa os volumes em paz. Com ela, todo volume não ligado a um contêiner some, e o volume de um banco parado conta como não ligado.
Não há resposta certa, mas numa máquina com alguns projetos ativos, de 15 a 25 GB é normal, e 60 GB quer dizer que o cache de compilação nunca foi limpo. Confira com docker system df -v antes de supor que são as imagens.
Textos mais curtos que aprofundam uma parte deste guia.