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

#1
open55proposed by devops · Aug 14, 2026 · based on v1
Result · becomes v2
1
Посмотреть, что занимает место

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Ручная очистка работает один раз — потом про неё забывают. Рабочая схема из двух задач 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 # автоочистка

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

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