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.