Руководство по месту для разработчиков

Docker занимает место на моём Mac

Docker Desktop хранит всё в одном файле. Он растёт при каждой сборке, а удаление образов его не уменьшает. Вот почему так и что на самом деле возвращает место.

14 дней бесплатно, карта не нужна. Затем $15 один раз за 3 компьютера, macOS и Linux.

Древовидная карта Bytesweep: образ диска Docker занимает почти всю домашнюю папку Mac

Где именно место

Docker Desktop на macOS запускает виртуальную машину с Linux, и вся файловая система этой машины — один разрежённый файл на вашем Mac:

~/Library/Containers/com.docker.docker/Data/vms/0/data/Docker.raw

Проверьте его реальный размер на диске — не логический, который всегда равен максимуму, разрешённому вами для Docker:

du -h -d0 ~/Library/Containers/com.docker.docker/Data/vms/0/data/

Почему удаление образов его не уменьшает

Удаление образа освобождает блоки внутри файловой системы виртуальной машины, но файл на вашем Mac сохраняет свой размер — он уже забрал это место у macOS. Свежие версии Docker Desktop отправляют TRIM изнутри машины, что позволяет macOS вернуть освобождённые блоки, но происходит это по расписанию Docker, а не в момент, когда вы выполнили prune. До тех пор docker system df сообщает об освобождённых гигабайтах, а Finder не показывает никаких изменений.

Как вернуть место

По порядку: от наименее разрушительного.

1. Посмотрите, сколько, по мнению Docker, он занимает

Всегда начинайте отсюда. Команда разделяет образы, контейнеры, тома и кэш сборки и показывает, сколько из каждого можно вернуть.

docker system df -v

2. Очистите кэш сборки

На машине, где образы собираются регулярно, это обычно самый крупный пункт и самый безопасный для удаления — единственная плата в том, что следующая сборка будет медленнее.

docker builder prune -a

3. Уберите то, что действительно не используется

Остановленные контейнеры, повисшие образы и неиспользуемые сети:

docker system prune

Добавьте -a чтобы удалить ещё и все образы, не занятые работающим контейнером, — их придётся скачивать заново. Добавляйте --volumes только если уверены: в томах базы данных хранят свои данные, и это единственная команда на этой странице, которая уничтожает то, что нельзя скачать снова.

4. Посмотрите список томов, прежде чем их трогать

Проверьте, что именно будет удалено:

docker volume ls
docker volume ls -f dangling=true

Docker редко бывает единственной причиной

Можно выполнить все команды с этой страницы, а на том же Mac Xcode DerivedData и пара забытых наборов весов обычно занимают не меньше. Bytesweep измеряет реальный размер Docker на диске рядом со всем остальным за один десятисекундный проход, поэтому диск чинится за раз, а не по одному инструменту.

5. Заставьте macOS вернуть место в файле

После очистки у Docker Desktop есть штатный способ вернуть освобождённые блоки: Настройки → Ресурсы → Дополнительно → Использование дискалибо выход и повторный запуск Docker Desktop, который запускает TRIM при старте. Дайте минуту и проверьте размер файла заново, прежде чем решать, что не сработало.

6. Уменьшите лимит диска

В разделе Настройки → Ресурсылимит виртуального диска определяет, до какого размера Docker.raw разрешено расти. Само по себе уменьшение ничего не освободит, но ограничит проблему. Именно привычка поднимать лимит «на всякий случай» и довела файл до 64 ГБ.

7. Крайняя мера

Настройки → Устранение неполадок → Clean / Purge data полностью сбрасывает диск виртуальной машины и возвращает файл почти к нулю. Это удаляет все ваши образы, контейнеры и тома. Пользуйтесь этим, когда ничего другое не помогло и вы знаете, что лежит в томах.

Не удаляйте Docker.raw через Finder. Это не файл кэша, а данные всей установки Docker; удаление его при работающем Docker может оставить виртуальную машину в состоянии, из которого всё равно понадобится сброс.

Тоже стоит проверить

Docker редко бывает один

На том Mac, где Docker дорос до 50 ГБ, DerivedData в Xcode и локальные модели ИИ обычно идут следом. Если вы освобождаете место, стоит один раз измерить весь диск, а не чинить по одной вещи за раз. Полный список →

В Linux файла образа нет

Docker в Linux пишет прямо в /var/lib/dockerпоэтому prune освобождает место сразу, и описанной выше проблемы с TRIM не возникает. Очистка в Linux →

Посмотрите на Docker рядом со всем остальным

Bytesweep измеряет реальный размер Docker на диске, показывает его рядом с Xcode, симуляторами, node_modules и весами моделей и отмечает, что безопасно очищать, — не трогая ваши тома.

Вопросы

Безопасно ли удалять Docker.raw?

Не через Finder и не при работающем Docker. Этот один файл — все ваши образы, контейнеры и тома. Если вы действительно хотите начать с чистого листа, используйте «Устранение неполадок → Clean / Purge data» в Docker Desktop: это делает то же самое, но так, как Docker ожидает.

Почему docker system prune пишет, что освободил 20 ГБ, а ничего не изменилось?

Потому что он освободил 20 ГБ внутри файловой системы виртуальной машины, а не на вашем Mac. Файл сохраняет размер, пока не отработает TRIM и macOS не заберёт блоки обратно. Обычно это запускается выходом и повторным открытием Docker Desktop.

Удалит ли docker system prune мои базы данных?

Только если добавить --volumes. Без этого флага тома не трогаются. С ним удаляется любой том, не подключённый к контейнеру, а том остановленной базы данных считается неподключённым.

Каким должен быть размер Docker.raw?

Единственно верного ответа нет, но на машине с несколькими активными проектами 15–25 ГБ — это нормально, а 60 ГБ означает, что кэш сборки не очищали ни разу. Проверьте docker system df -v прежде чем считать, что дело в образах.