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

#1
open55proposed by devops · Aug 14, 2026 · based on v1
Proposed changes · v1 → suggestion
55
Посмотреть, что занимает местоMoved

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

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

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

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

docker system df -v
Убрать безопасное: остановленные контейнеры и кэш сборкиMoved

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

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

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

docker builder prune
Удалить старые образы — с фильтром по времениRecommendedMoved
bash
1# только висячие — слои без тега, самое безопасное
2docker image prune
3
4# все неиспользуемые старше суток — ОСТОРОЖНО
5docker image prune -a --filter "until=24h"

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

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

docker image prune
Тома — только вручную и глазамиMoved
bash
1docker volume ls # список
2docker volume ls -f dangling=true # ни к чему не прикреплённые

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

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

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

docker volume ls -f dangling=true
Настроить регулярную очистку и мониторингRecommendedMoved

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

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

crontab -l
# Зачем этоRemoved
# Зачем это Docker не убирает за собой. Каждая сборка оставляет слои, каждый перезапуск — старые образы. На активном сервере десятки гигабайт накапливаются за месяцы, и однажды диск просто кончается. Причём в самый неудачный момент: когда сервису надо перезапуститься. Но у очистки есть обратная сторона, про которую редко пишут. Она в конце списка, и это самая важная часть.
## Главное: «неиспользуемый» не равно «ненужный»Removed
## Главное: «неиспользуемый» не равно «ненужный» Почти вся документация по очистке говорит: «безопасно, удаляются только неиспользуемые ресурсы». Это правда буквально и обманчива по сути. **Реальный случай.** Сервис в кластере лежал в состоянии `0/1` — упал несколько недель назад и не поднялся. Контейнера нет, значит образ **не используется**. Прошла очистка с `-a` и честно его удалила. Когда дошли руки починить сервис, оказалось: ``` Unable to find image 'registry/service:v1.2.1' locally ``` Образ пришлось тянуть заново — а это требует сети, доступа к реестру и времени. Если реестр приватный, а ключи истекли — восстановление превращается в отдельный квест. **Что из этого следует:** | Ресурс | Когда считается неиспользуемым | Чем грозит удаление | |---|---|---| | Образ | на нём не запущен ни один контейнер **прямо сейчас** | лежачий сервис не поднимется без сети | | Том | не прикреплён ни к одному контейнеру | **потеря данных навсегда** | | Сеть | нет подключённых контейнеров | почти ничем, создастся заново | **Правило:** перед `prune -a` проверь, нет ли сервисов в состоянии `0/N`. Их образы выглядят ненужными ровно до того момента, когда понадобятся. ```bash docker service ls | grep -v "1/1\|2/2\|3/3" ```
Removed
Removed
## ШпаргалкаRemoved
## Шпаргалка ```bash # посмотреть df -h / docker system df -v docker service ls | grep -v "1/1" # кто лежит — ПЕРЕД очисткой # безопасно docker container prune docker builder prune docker network prune # с оглядкой docker image prune # только висячие docker image prune -a --filter "until=24h" # все неиспользуемые старше суток # только вручную docker volume ls -f dangling=true docker volume rm имя-тома ``` Одна команда, которую стоит запомнить как опасную: `docker system prune -a --volumes`. Она убирает всё сразу, включая тома. На сервере с боевыми данными её не запускают никогда.
Review