Перейти к содержимому

🧙 Садовник: уточнил шаги, добавил проверки и обоснования. Примите, если полезно.

#1
открыто−5⇅5предложил devops · 14 авг. 2026 г. · на основе v1
Итог · станет v3
1
Посмотреть, что занимает место

Сначала диск целиком, потом Docker отдельно:

bash
1df -h / # сколько занято на диске
2docker system df # сколько из этого — Docker

docker system df разбивает по категориям: образы, контейнеры, тома, кэш сборки. Колонка RECLAIMABLE показывает, сколько можно освободить.

Подробнее — флаг -v.

Зачем: Без этого шага очистка превращается в стрельбу вслепую. Часто оказывается, что место ест вовсе не Docker, а, например, логи в `/var/log`.
$docker system df -v
  • –Ты знаешь, сколько процентов диска занято
  • –Ты знаешь, какая категория Docker занимает больше всего
2
Убрать безопасное: остановленные контейнеры и кэш сборки

С этого начинай — риска почти нет, а освобождается много:

bash
1docker container prune # остановленные контейнеры
2docker builder prune # кэш сборки
3docker network prune # неиспользуемые сети

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

Зачем: Остановленный контейнер не нужен никому: если сервис управляется оркестратором или compose, он создаст новый. Кэш сборки — чисто ускорение, на работу никак не влияет.
$docker builder prune
  • –Освобождённый объём виден в выводе команды
  • –Запущенные контейнеры не пострадали
3
Удалить старые образы — с фильтром по времениРекомендуется
bash
1# только висячие — слои без тега, самое безопасное
2docker image prune
3
4# все неиспользуемые старше суток — ОСТОРОЖНО
5docker image prune -a --filter "until=24h"

Разница принципиальная. Без -a удаляются только висячие слои — остатки пересборок. С -a удаляются все образы, на которых прямо сейчас не запущен ни один контейнер.

Фильтр until=24h оставляет свежее — то, что скачали сегодня для выкатки.

Зачем: Именно флаг `-a` и приводит к тому, ради чего написан этот список. Разбор — в следующем блоке.
$docker image prune
  • –Ты понимаешь разницу между prune и prune -a
4
Тома — только вручную и глазами
bash
1docker volume ls # список
2docker volume ls -f dangling=true # ни к чему не прикреплённые

Смотри список и удаляй поимённо:

bash
1docker volume rm имя-тома

Никогда не запускай docker volume prune на сервере с базами, не посмотрев список. Том остановленной базы считается неприкреплённым.

Зачем: Образ можно скачать заново. Контейнер можно создать заново. Том — единственное место, где лежат данные, и восстановить его неоткуда, кроме резервной копии. Если она есть.
$docker volume ls -f dangling=true
  • –Ты просмотрел список томов глазами
  • –Ты не запускал volume prune без проверки
5
Настроить регулярную очистку и мониторингРекомендуется

Ручная очистка работает один раз — потом про неё забывают. Рабочая схема из двух задач cron:

cron
1# очистка каждую ночь
20 3 * * * /root/docker-cleanup.sh >> /var/log/docker-cleanup.log 2>&1
3
4# проверка диска каждые 6 часов
50 */6 * * * /root/disk-monitor.sh >> /var/log/disk-monitor.log 2>&1

Разумные пороги в скрипте мониторинга:

bash
1DISK_THRESHOLD=80 # предупреждение
2DISK_CRITICAL=85 # автоочистка

Обязательно пиши логи — иначе при пропаже образа не узнаешь, кто его удалил и когда.

Зачем: На боевом сервере такая пара задач освободила около 20 ГБ и сняла заполнение диска с 87% до 51%. Главное — это происходит до того, как диск кончится посреди выкатки.
$crontab -l
  • –Задачи видны в crontab -l
  • –Очистка пишет лог, и ты знаешь где он
  • –Автоочистка не использует prune для томов