Безопасная очистка 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.
Безопасный порядок очистки
- Проверить
df -h. - Выполнить
docker system df -v. - Проверить работающие и остановленные контейнеры.
- Удалить ненужные остановленные контейнеры.
- Удалить dangling-образы.
- Проверить и очистить build cache.
- Удалить неиспользуемые сети.
- Отдельно проверить каждый неиспользуемый том.
- Повторно проверить место и работоспособность сервисов.
Минимальный безопасный набор
Для осторожной очистки без томов и без удаления всех неиспользуемых образов:
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: контейнеры, образы и кэш можно восстановить, а данные удалённого тома — только из резервной копии.