Безопасная очистка Docker от неиспользуемых данных

Пошаговая очистка Docker от остановленных контейнеров, старых образов, неиспользуемых сетей, build cache и томов без случайной потери данных.

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

В этой инструкции рассматривается только безопасная очистка Docker. Главный принцип — сначала проверить, что занимает место, и только после этого удалять ненужные объекты.

Проверено на: Ubuntu Server 24.04 LTS и Docker Engine
Уровень сложности: начальный
Время выполнения: около 15 минут
Требуемый доступ: пользователь с доступом к Docker

Что будет рассмотрено

После выполнения инструкции можно будет:

  • проверить использование диска Docker;
  • найти остановленные контейнеры;
  • удалить ненужные контейнеры и образы;
  • очистить build cache;
  • удалить неиспользуемые сети;
  • безопасно проверить тома;
  • использовать docker system prune;
  • определить, почему каталог Docker продолжает занимать много места.

Проверка свободного места

Сначала проверьте файловую систему:

df -h

Для корневого раздела:

df -h /

Проверьте размер каталога Docker:

sudo du -sh /var/lib/docker

На системах с изменённым data-root путь может отличаться.

Проверьте текущий корневой каталог Docker:

docker info |
grep 'Docker Root Dir'

Использование диска средствами Docker

Краткий отчёт:

docker system df

Подробный отчёт:

docker system df -v

В отчёте отображаются:

  • образы;
  • контейнеры;
  • локальные тома;
  • build cache;
  • потенциально освобождаемое место.

Поле RECLAIMABLE показывает объём, который Docker считает доступным для очистки.

Проверка работающих контейнеров

Перед любым удалением посмотрите активные контейнеры:

docker ps

Все контейнеры, включая остановленные:

docker ps -a

Удобный табличный вывод:

docker ps -a   --format 'table {{.Names}}	{{.Image}}	{{.Status}}	{{.Size}}'

Не удаляйте контейнер только потому, что он остановлен. Он может быть частью временно выключенного проекта.

Поиск остановленных контейнеров

docker ps -a   --filter status=exited

Контейнеры, созданные, но ни разу не запущенные:

docker ps -a   --filter status=created

Проверьте назначение каждого контейнера перед удалением.

Удаление одного контейнера

docker rm CONTAINER_NAME

Для работающего контейнера Docker вернёт ошибку.

Принудительное удаление:

docker rm -f CONTAINER_NAME

Используйте -f только когда остановка и удаление действительно допустимы.

Удаление всех остановленных контейнеров

Предварительный список:

docker ps -a   --filter status=exited   --format '{{.Names}}'

Интерактивная очистка:

docker container prune

Docker покажет предупреждение и запросит подтверждение.

Без подтверждения:

docker container prune -f

Команда не удаляет работающие контейнеры.

Проверка образов

Список образов:

docker image ls

Все слои и промежуточные образы:

docker image ls -a

Сортировка по размеру:

docker image ls   --format '{{.Size}}	{{.Repository}}:{{.Tag}}	{{.ID}}' |
sort -h

Dangling-образы

Dangling-образ не имеет имени и тега.

Проверьте:

docker image ls   --filter dangling=true

Удалите:

docker image prune

Без подтверждения:

docker image prune -f

Удаление всех неиспользуемых образов

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

docker ps   --format 'table {{.Names}}	{{.Image}}'

Затем:

docker image prune -a

Параметр -a удаляет все образы, которые не используются существующими контейнерами, а не только dangling-образы.

Важно: после такой очистки образы может потребоваться снова загружать из registry.

Удаление одного образа

docker image rm IMAGE_NAME:TAG

Либо по идентификатору:

docker image rm IMAGE_ID

Если образ используется контейнером, Docker не позволит удалить его без дополнительных действий.

Проверка сетей

docker network ls

Неиспользуемые сети:

docker network ls   --filter dangling=true

Подробная информация:

docker network inspect NETWORK_NAME

Очистка сетей

docker network prune

Без подтверждения:

docker network prune -f

Docker удаляет только сети, которые не используются контейнерами.

Стандартные сети bridge, host и none не удаляются.

Проверка build cache

docker builder du

Если используется Buildx:

docker buildx du

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

Очистка build cache

Обычная очистка:

docker builder prune

Удаление всего неиспользуемого кэша:

docker builder prune -a

Без подтверждения:

docker builder prune -a -f

После полной очистки следующая сборка может выполняться заметно дольше.

Проверка томов

Список томов:

docker volume ls

Неиспользуемые тома:

docker volume ls   --filter dangling=true

Подробная информация:

docker volume inspect VOLUME_NAME

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

docker ps -a   --filter volume=VOLUME_NAME

Если команда ничего не вернула, том не подключён к существующим контейнерам. Это ещё не означает, что данные внутри него не нужны.

Почему тома требуют особой осторожности

Тома могут содержать:

  • базы данных;
  • загруженные пользователями файлы;
  • конфигурацию приложений;
  • очереди;
  • сертификаты;
  • другие постоянные данные.

Удаление контейнера не обязательно удаляет том. Благодаря этому данные можно сохранить при пересоздании сервиса.

Но удаление самого тома необратимо без резервной копии.

Просмотр содержимого тома

docker run --rm   -v VOLUME_NAME:/data:ro   alpine   find /data -maxdepth 2 -type f | head -100

Проверка размера:

docker run --rm   -v VOLUME_NAME:/data:ro   alpine   du -sh /data

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

Создайте каталог:

mkdir -p ~/docker-volume-backups

Создайте архив:

docker run --rm   -v VOLUME_NAME:/source:ro   -v ~/docker-volume-backups:/backup   alpine   tar -czf /backup/VOLUME_NAME.tar.gz -C /source .

Проверьте архив:

tar -tzf   ~/docker-volume-backups/VOLUME_NAME.tar.gz |
head

Для работающих баз данных используйте штатный дамп, а не только файловый архив.

Удаление одного тома

docker volume rm VOLUME_NAME

Если том подключён к контейнеру, Docker не позволит его удалить.

Очистка неиспользуемых томов

Сначала ещё раз проверьте список:

docker volume ls   --filter dangling=true

Запустите очистку:

docker volume prune

Без подтверждения:

docker volume prune -f

Критически важно: не добавляйте очистку томов в автоматический скрипт без отдельной проверки и резервного копирования.

Очистка Docker Compose-проекта

Перейдите в каталог проекта:

cd /path/to/project

Остановите и удалите контейнеры и сеть:

docker compose down

Образы и именованные тома останутся.

Удаление контейнеров вместе с локальными образами:

docker compose down --rmi local

Удаление вместе с именованными томами:

docker compose down -v

Осторожно: -v удаляет постоянные данные проекта.

Перед выполнением проверьте секцию volumes и наличие резервных копий.

Комплексная очистка system prune

Проверить занимаемое место:

docker system df

Стандартная очистка:

docker system prune

Она удаляет:

  • остановленные контейнеры;
  • неиспользуемые сети;
  • dangling-образы;
  • неиспользуемый build cache.

Тома по умолчанию не удаляются.

Расширенная очистка

docker system prune -a

Дополнительно удаляются все образы, не используемые существующими контейнерами.

Без подтверждения:

docker system prune -a -f

Для production-сервера лучше сначала выполнять отдельные проверки, а не сразу запускать максимальную очистку.

Очистка с томами

Команда:

docker system prune -a --volumes

может удалить неиспользуемые тома.

На сервере с важными данными её не следует использовать без инвентаризации томов и резервных копий.

Очистка объектов старше определённого времени

Удалить остановленные контейнеры старше 7 дней:

docker container prune   --filter 'until=168h'

Удалить неиспользуемые образы старше 7 дней:

docker image prune -a   --filter 'until=168h'

Удалить build cache старше 7 дней:

docker builder prune   --filter 'until=168h'

Такой подход безопаснее полной очистки без временного ограничения.

Проверка после очистки

docker system df

Проверьте файловую систему:

df -h

Размер каталога Docker:

sudo du -sh   "$(docker info --format '{{.DockerRootDir}}')"

Проверьте работающие контейнеры:

docker ps

Для Compose-проектов:

docker compose ps

Почему место не освободилось

Удалённый файл всё ещё открыт процессом

Проверьте:

sudo lsof +L1

Если процесс держит удалённый файл открытым, место освободится только после его перезапуска или закрытия файла.

Большие логи контейнеров

Проверьте:

sudo find /var/lib/docker/containers   -type f   -name '*-json.log'   -printf '%s %p\n' 2>/dev/null |
sort -nr |
head -20 |
numfmt --field=1 --to=iec

Для предотвращения повторного роста настройте ротацию логов Docker.

Большие тома

Подробный отчёт:

docker system df -v

Дополнительно:

sudo du -sh /var/lib/docker/volumes/* 2>/dev/null |
sort -h |
tail -20

Не удаляйте каталоги томов вручную.

Build cache

Проверьте:

docker builder du

Очистите при необходимости:

docker builder prune -a

Что нельзя удалять вручную

Не удаляйте содержимое следующих каталогов через rm -rf:

/var/lib/docker/containers
/var/lib/docker/image
/var/lib/docker/overlay2
/var/lib/docker/volumes

Ручное удаление может повредить внутреннее состояние Docker и привести к потере данных.

Используйте команды Docker.

Безопасный порядок очистки

  1. Проверить df -h.
  2. Выполнить docker system df -v.
  3. Проверить работающие и остановленные контейнеры.
  4. Удалить ненужные остановленные контейнеры.
  5. Удалить dangling-образы.
  6. Проверить и очистить build cache.
  7. Удалить неиспользуемые сети.
  8. Отдельно проверить каждый неиспользуемый том.
  9. Повторно проверить место и работоспособность сервисов.

Минимальный безопасный набор

Для осторожной очистки без томов и без удаления всех неиспользуемых образов:

docker container prune
docker image prune
docker network prune
docker builder prune

После каждой команды Docker показывает предупреждение и запрашивает подтверждение.

Типичные проблемы

Образ не удаляется

Проверьте контейнеры, использующие его:

docker ps -a   --filter ancestor=IMAGE_NAME

Сеть не удаляется

Проверьте участников:

docker network inspect NETWORK_NAME

Том не удаляется

Проверьте контейнеры:

docker ps -a   --filter volume=VOLUME_NAME

После очистки Compose снова загружает образы

Это ожидаемо, если неиспользуемые образы были удалены.

Запустите:

docker compose pull
docker compose up -d

Контейнер пропал после prune

docker container prune удаляет все остановленные контейнеры. Восстановите контейнер из compose.yaml:

docker compose up -d

Постоянные данные сохранятся только если они находились в томе или bind mount.

Быстрый набор команд

Проверить место:

docker system df -v

Удалить остановленные контейнеры:

docker container prune

Удалить dangling-образы:

docker image prune

Очистить build cache:

docker builder prune

Удалить неиспользуемые сети:

docker network prune

Показать неиспользуемые тома:

docker volume ls   --filter dangling=true

Итог

После выполнения инструкции:

  • проверено использование диска Docker;
  • удалены ненужные остановленные контейнеры;
  • очищены старые образы и build cache;
  • удалены неиспользуемые сети;
  • рассмотрена безопасная проверка томов;
  • показано применение docker system prune;
  • разобраны причины, по которым место может не освобождаться.

Главное правило очистки Docker: контейнеры, образы и кэш можно восстановить, а данные удалённого тома — только из резервной копии.

← Предыдущая статья Политики перезапуска контейнеров Docker Следующая статья → Создание виртуальной машины в Proxmox VE