Docker хранит образы, контейнеры, тома и кэш сборки. Промежуточные слои BuildKit ускоряют повторные сборки, но со временем занимают место. Ниже - диагностика и выборочная очистка. Все числа и выводы команд - иллюстративный снимок одной Ubuntu-системы; на вашем хосте они будут другими.
Определить источник расхода диска
docker info --format '{{.DockerRootDir}}'
df -h
docker system df
Запомните свободное место по df -h на файловой системе с каталогом Docker. Для bind mounts проверьте и файловые системы соответствующих каталогов хоста: их данные не входят в Local Volumes.
TYPE TOTAL ACTIVE SIZE RECLAIMABLE
Images 21 13 12.64GB 3.146GB (24%)
Containers 13 13 712.7kB 0B (0%)
Local Volumes 1 1 68.07MB 0B (0%)
Build Cache 857 0 281.3GB 19.79GB
TYPE - категория; TOTAL - число объектов; ACTIVE - число используемых; SIZE - учитываемый размер; RECLAIMABLE - оценка Docker для очистки, не гарантированный прирост свободного места.
Images: 13 из 21 образа используются контейнерами. Для образов Docker оцениваетRECLAIMABLEв 3,146 ГБ, но фактический выигрыш на диске может отличаться. Среди неиспользуемых образов могут быть версии для отката.Containers: все 13 активны, их записываемые слои занимают 712,7 кБ. Логи и данные в томах или bind mounts в этот размер не входят; проверяйте их отдельно с учётом драйвера логирования и путей монтирования.Local Volumes: единственный том (68,07 МБ) используется контейнером и может содержать постоянные данные приложения или БД; удалять его нельзя. Bind mounts сюда не входят.Build Cache: 857 записей, 281,3 ГБ учтённого кэша. ПоказательRECLAIMABLEздесь - оценка Docker, а не обещание освободить 19,79 ГБ на диске.
Подробности об образах и контейнерах
docker system df -v показывает размеры образов, общие и уникальные слои, число использующих образ контейнеров, записываемые слои контейнеров, тома и записи кэша. В таблице образов SIZE - полный логический размер, SHARED SIZE - слои, общие с другими образами, UNIQUE SIZE - собственные данные, CONTAINERS - число использующих образ контейнеров. Складывать размеры образов нельзя: например, несколько .NET-приложений могут делить один слой .NET Runtime. Удаление одного образа не освободит слой, пока он нужен другому.
docker system df -v
docker ps -a --size
Пример размера контейнера: 24.6kB (virtual 279MB). Первое число - его записываемый слой, virtual - контейнер вместе с базовым образом. Значения virtual нельзя суммировать из-за общих слоёв. docker ps -a --size не учитывает логи, тома и bind mounts, поэтому не показывает весь связанный с контейнером расход диска.
Если в IMAGE вместо имени указан ID, например 8e12852cff3c, тег обычно перенесён на новый образ или утрачен. Работающий контейнер продолжает удерживать исходный образ и необходимые ему слои.
Проверить неиспользуемые объекты
docker container ls -a --filter status=exited
docker image ls --filter dangling=true
docker volume ls --filter dangling=true
Первая команда ищет контейнеры со статусом exited; если виден только заголовок таблицы, таких контейнеров нет. Вторая ищет dangling-образы - образы без имени и тега, часто оставшиеся после пересборки. Третья показывает тома без ссылок из контейнеров, включая анонимные и именованные. Пустой результат означает отсутствие объектов именно по указанному фильтру. На иллюстративном снимке все три списка были пусты.
Разобраться с BuildKit-кэшем
Для стандартного сборщика Docker Engine (default) выполните:
docker buildx du --builder default
Shared: 261.5GB
Private: 19.79GB
Reclaimable: 281.3GB
Total: 281.3GB
Shared - данные, общие с другими ресурсами, обычно образами; звёздочка в размере отдельной записи (1.372GB*) означает то же. После удаления записи слой остаётся на диске, пока нужен образу. Private - данные без такого совместного использования: 19,79 ГБ служат лишь ориентиром возможной очистки. Reclaimable - логический размер записей, доступных для удаления; true в колонке RECLAIMABLE у отдельной записи означает, что она сейчас не используется. Total - общий логический размер кэша.
docker system df и docker buildx du учитывают ресурсы по-разному. Удаление 281,3 ГБ логического кэша не гарантирует столько же свободного места: общие слои останутся у образов, а результат зависит и от других изменений на диске. Фактическую разницу покажет df -h на той же файловой системе до и после.
Очистить кэш сборки
Для неиспользуемого кэша стандартного сборщика Docker Engine:
docker builder prune -a
Docker запросит подтверждение. Команда удаляет неиспользуемый BuildKit-кэш, но не останавливает и не удаляет работающие контейнеры, тома или образы приложений. Следующие сборки могут замедлиться: зависимости и промежуточные слои придётся создавать заново.
Чтобы сохранить недавно использованный кэш, ограничьте очистку записями, не использовавшимися 7 или 14 дней:
docker builder prune -a --filter "until=168h"
docker builder prune -a --filter "until=336h"
Очистить образы и тома при необходимости
Образы
docker image prune
docker image ls
docker image prune -a
docker image prune удаляет только dangling-образы и почти ничего не даст, если их список пуст. Перед docker image prune -a просмотрите docker image ls: ключ -a удалит все образы, не используемые существующими контейнерами, в том числе именованные SDK-образы, базовые образы для будущих сборок и версии приложения для отката. В снимке Docker оценивал такие образы в 3,146 ГБ; реально освобождённое место может отличаться.
Тома
docker volume ls --filter dangling=true
docker volume prune
По умолчанию docker volume prune удаляет только неиспользуемые анонимные локальные тома, на которые не ссылается ни один контейнер. Список docker volume ls --filter dangling=true шире: в нём есть и неиспользуемые именованные тома. Команда docker volume prune --all добавляет их к очистке. Тома могут содержать БД, загруженные файлы и состояние приложения: удаляйте их, только убедившись, что данные не нужны. Если список пуст, очистка томов не требуется.
Проверить результат
docker buildx du --builder default
docker system df
df -h
Сравните данные для того же сборщика и той же файловой системы с состоянием до очистки. Число записей кэша может уменьшиться, Private - снизиться при удалении уникальных записей; работающие контейнеры продолжат работать. Реально освободившееся место видно в df -h, и оно может отличаться от оценок Docker.