Накопление неиспользуемых образов, контейнеров и томов Docker — распространенная проблема, которая приводит к потере десятков гигабайт дискового пространства и замедлению работы системы. Это практическое руководство содержит полный набор проверенных команд для безопасной и эффективной очистки вашей Docker-инфраструктуры. Вы научитесь диагностировать источник проблемы, точечно удалять объекты и применять мощные команды prune для комплексного высвобождения места. Инструкции адаптированы для Linux и Windows (Docker Desktop) и включают готовые скрипты для автоматизации регулярного обслуживания.
Диагностика: что именно съедает ваше дисковое пространство в Docker
Перед любыми удалениями критически важно понять, какие именно объекты Docker занимают место. Действие вслепую может привести к потере важных данных. Docker предоставляет встроенные инструменты для быстрой диагностики.
Анализ общей статистики с помощью docker system df
Команда docker system df — это ваш главный инструмент для оценки масштаба проблемы. Она показывает сводку по использованию дискового пространства, разбивая данные по типам объектов: Images (образы), Containers (контейнеры), Local Volumes (локальные тома) и Build Cache (кэш сборки). Для детального анализа используйте флаг -v (verbose):
docker system df -v
В выводе обратите внимание на ключевые колонки:
- TOTAL: общий объем, занимаемый объектами данного типа.
- ACTIVE: количество активных (используемых) объектов.
- SIZE: фактический размер на диске.
- RECLAIMABLE: объем пространства, который можно освободить, удалив неиспользуемые объекты. Этот процент — ваш потенциальный «выигрыш».
Например, строка Images с RECLAIMABLE: 1.2GB (85%) говорит о том, что 85% пространства, занятого образами, приходится на неиспользуемые данные, которые можно безопасно удалить.
Поиск самых объемных образов и контейнеров
Чтобы выявить главных «виновников» нехватки места, отсортируйте образы по размеру. Используйте форматированный вывод и утилиту sort:
docker images --format "table {{.Size}}\t{{.Repository}}\t{{.Tag}}" | sort -h -r
Эта команда выведет список образов, отсортированный по убыванию размера (-r), с учетом человеко-читаемых единиц (-h).
Важно помнить: размер образа, указанный в docker images, — это суммарный размер его слоев. Если несколько образов используют общие базовые слои, они не дублируются на диске. Поэтому общее занимаемое место может быть меньше суммы размеров всех образов. Для просмотра контейнеров и их размера RW-слоя (разница от образа) используйте docker ps -a -s.
Безопасное удаление: точечные команды для разных типов объектов
После диагностики можно приступать к точечной очистке. Системный подход «просмотр → остановка → удаление» минимизирует риски.
Удаление контейнеров: остановленных и работающих
Удаление контейнера — двухэтапный процесс, если он запущен. Сначала остановите контейнер, затем удалите его.
# Остановить контейнер по ID или имени
docker stop <container_id_or_name>
# Удалить контейнер
docker rm <container_id_or_name>
Чтобы удалить все остановленные контейнеры разом, используйте команду с подстановкой:
docker rm $(docker ps -a -q -f status=exited)
Критически важное предупреждение: Команда docker rm без флага -v не удаляет ассоциированные тома (volumes). Тома остаются на диске как «висячие» (dangling). Это хорошо, если в томе хранятся данные, которые нужно сохранить (например, база данных). Это плохо, если том больше не нужен и просто захламляет систему. Всегда проверяйте, какие тома примонтированы к контейнеру (docker inspect <container_id>), перед удалением.
Удаление образов по ID, тегу или шаблону имени
Для удаления образов используется команда docker rmi (remove image).
# Удалить образ по ID
docker rmi <image_id>
# Удалить образ по репозиторию и тегу
docker rmi myapp:latest
# Удалить несколько образов по шаблону имени (например, все тестовые)
docker images | grep "test-" | awk '{print $3}' | xargs docker rmi
Особое внимание стоит уделить «висячим» образам (dangling images) — это промежуточные слои, которые остались после сборки новых версий образов и больше не имеют тегов (<none>:<none>). Их удаление почти всегда безопасно.
# Показать ID висячих образов
docker images -f "dangling=true" -q
# Удалить все висячие образы
docker image prune
Если вы только начинаете работать с Docker, рекомендуем изучить полное руководство по Docker для DevOps, где подробно разбираются основы работы с образами и контейнерами.
Очистка томов (Volumes): максимальная осторожность
Тома — это механизм Docker для хранения постоянных (persistent) данных. Их удаление — самая рискованная операция, так как в томах часто хранятся данные БД, конфигурации и пользовательский контент.
# Просмотреть список томов
docker volume ls
# Удалить конкретный том (БУДЬТЕ ОЧЕНЬ ОСТОРОЖНЫ!)
docker volume rm <volume_name>
Золотое правило: Перед удалением тома необходимо быть абсолютно уверенным, что нужные данные из него вынесены в другое место или том больше не нужен. Для удаления неиспользуемых («висячих») томов, которые не примонтированы ни к одному контейнеру, используйте:
docker volume ls -f dangling=true
# Удалить все висячие тома
docker volume prune
Более глубокое погружение в управление томами и сетями, включая безопасное удаление, вы найдете в отдельном руководстве: Безопасное удаление Docker сетей и томов.
Радикальная очистка: команды prune для высвобождения места
Когда нужно быстро освободить место «здесь и сейчас», на помощь приходит семейство команд prune. Они предназначены для массового удаления всех неиспользуемых объектов Docker.
docker system prune: основная команда для комплексной очистки
Команда docker system prune — это «комбайн» для очистки. По умолчанию она удаляет:
- Все остановленные контейнеры.
- Все висячие образы (dangling images).
- Все неиспользуемые сети.
Для более агрессивной очистки используются ключевые флаги:
# Удалить ВСЕ неиспользуемые образы (не только dangling), остановленные контейнеры и сети
docker system prune -a
# Добавить к очистке все неиспользуемые тома (ОПАСНО!)
docker system prune -a --volumes
# Выполнить команду без интерактивного подтверждения (для скриптов)
docker system prune -a -f
После выполнения команда выводит отчет о том, сколько места было освобождено.
Специализированные prune: для образов, контейнеров, кэша сборки
Если нужно очистить что-то одно, используйте точечные команды:
docker image prune -a: удаляет все образы, не используемые хотя бы одним контейнером.docker container prune: удаляет все остановленные контейнеры.docker builder prune: очищает кэш сборки BuildKit, который может занимать много места после неудачных или многоэтапных билдов. Это особенно полезно после работы с оптимизированными Dockerfile.
Особенности очистки в Windows и Linux
Основные команды Docker идентичны для всех платформ, но есть нюансы в правах доступа и расположении данных.
Очистка в Linux: sudo, расположение данных и тонкости
В Linux для большинства команд Docker требуются права суперпользователя. Либо используйте sudo перед каждой командой, либо добавьте вашего пользователя в группу docker (что может быть небезопасно с точки зрения безопасности).
# Стандартный вызов с sudo
sudo docker system prune -a
# Проверить размер директории /var/lib/docker/
sudo du -sh /var/lib/docker/
Важно: Не удаляйте файлы из /var/lib/docker/ вручную через файловый менеджер или rm. Все операции должны выполняться через команды Docker CLI, иначе можно повредить внутренние структуры данных.
Очистка в Windows (Docker Desktop) через PowerShell и WSL2
В Windows с Docker Desktop команды можно выполнять в двух средах:
- PowerShell (от имени администратора): Команды идентичны, например,
docker system prune -a. - Терминал WSL2: Если Docker Desktop интегрирован с WSL2, команды также работают напрямую в WSL-терминале.
Данные Docker в Windows хранятся в виртуальном диске (VHDX). Управлять его максимальным размером можно в настройках Docker Desktop (Settings → Resources → Advanced). Там же, во вкладках «Images» и «Containers», доступен графический интерфейс для визуального удаления ненужных объектов.
Автоматизация: скрипты для регулярной очистки Docker
Чтобы избавиться от рутины ручной очистки, процесс можно автоматизировать с помощью скриптов.
Bash-скрипт для Linux и настройка Cron
Создайте файл docker-cleanup.sh:
#!/bin/bash
# Скрипт для автоматической очистки Docker
LOG_FILE="/var/log/docker-cleanup.log"
echo "[$(date)] Запуск очистки Docker" >> "$LOG_FILE"
# Проверяем, запущен ли Docker
if ! systemctl is-active --quiet docker; then
echo " Docker не запущен. Выход." >> "$LOG_FILE"
exit 1
fi
# Очищаем все неиспользуемые объекты старше 7 дней (168 часов)
# Используем -f для пропуска подтверждения
docker system prune -a -f --filter "until=168h" >> "$LOG_FILE" 2>&1
echo "[$(date)] Очистка завершена" >> "$LOG_FILE"
Сделайте скрипт исполняемым и добавьте задание в cron для еженедельного запуска (например, в воскресенье в 3:00):
chmod +x /path/to/docker-cleanup.sh
# Редактируем crontab: crontab -e
# Добавляем строку:
0 3 * * 0 /path/to/docker-cleanup.sh
Автоматизация в Windows: PowerShell и Планировщик заданий
Создайте PowerShell-скрипт DockerCleanup.ps1:
# DockerCleanup.ps1
$LogFile = "C:\Logs\docker-cleanup.log"
"$(Get-Date -Format 'yyyy-MM-dd HH:mm:ss') Запуск очистки Docker" | Out-File -FilePath $LogFile -Append
# Выполняем очистку всех неиспользуемых объектов
docker system prune -a -f --filter "until=168h" 2>&1 | Out-File -FilePath $LogFile -Append
"$(Get-Date -Format 'yyyy-MM-dd HH:mm:ss') Очистка завершена" | Out-File -FilePath $LogFile -Append
Настройте автоматический запуск через Планировщик заданий Windows, указав триггер (например, еженедельно) и действие: запуск PowerShell с параметром -File "C:\Scripts\DockerCleanup.ps1" с наивысшими привилегиями.
Для комплексного управления запущенными контейнерами, их отладки и мониторинга, которые часто идут рука об руку с обслуживанием, сохраните шпаргалку команд по управлению контейнерами.
Чек-лист безопасности и ответы на частые вопросы
Чек-лист безопасности перед очисткой:
- Бэкап томов: Перед использованием
docker system prune --volumesилиdocker volume pruneубедитесь, что в удаляемых томах нет нужных данных. При необходимости сделайте бэкап. - Проверка списков: Всегда выполняйте
docker ps -aиdocker imagesперед массовым удалением, чтобы случайно не удалить нужный, но остановленный контейнер или образ. - Используйте фильтры: Команды
pruneподдерживают флаг--filter. Например,--filter "until=24h"удалит только объекты, созданные более 24 часов назад.
Ответы на частые вопросы (FAQ):
- Почему после
docker rmi <image>место на диске не освободилось? Вероятно, от этого образа до сих пор запущен контейнер (даже в остановленном состоянии). Сначала удалите все контейнеры, использующие этот образ (docker rm), затем удаляйте сам образ. - Как полностью очистить кэш сборки BuildKit? Используйте команду
docker builder prune. Для удаления всего кэша, включая встроенный, можно добавить флаг-a. - Можно ли восстановить удаленные образы, контейнеры или тома? Нет, если не было внешнего бэкапа. Удаление через Docker CLI окончательно. Образы можно загрузить заново из registry, а данные томов — только из вашей резервной копии.
- Команда
pruneудалила что-то нужное. Что делать? К сожалению, отката нет. Это подчеркивает важность предварительной проверки списков и использования фильтраuntilдля более безопасной автоматизации.
Для построения надежных и безопасных production-сред, где вопросы очистки являются частью общего жизненного цикла, изучите принципы из гайда по продвинутому Docker.