Посмотреть, что занимает местоПеремещён
Сначала диск целиком, потом Docker отдельно:
1df -h /
2docker system df
docker system df разбивает по категориям: образы, контейнеры, тома, кэш сборки. Колонка RECLAIMABLE показывает, сколько можно освободить.
Подробнее — флаг -v.
docker system df -vУбрать безопасное: остановленные контейнеры и кэш сборкиПеремещён
С этого начинай — риска почти нет, а освобождается много:
1docker container prune
2docker builder prune
3docker network prune
Кэш сборки обычно самая жирная строка на сервере, где регулярно собирают образы. Его потеря стоит только времени следующей сборки.
docker builder pruneУдалить старые образы — с фильтром по времениРекомендуетсяПеремещён
1
2docker image prune
3
4
5docker image prune -a --filter "until=24h"
Разница принципиальная. Без -a удаляются только висячие слои — остатки пересборок. С -a удаляются все образы, на которых прямо сейчас не запущен ни один контейнер.
Фильтр until=24h оставляет свежее — то, что скачали сегодня для выкатки.
docker image pruneТома — только вручную и глазамиПеремещён
1docker volume ls
2docker volume ls -f dangling=true
Смотри список и удаляй поимённо:
1docker volume rm имя-тома
Никогда не запускай docker volume prune на сервере с базами, не посмотрев список. Том остановленной базы считается неприкреплённым.
docker volume ls -f dangling=trueНастроить регулярную очистку и мониторингРекомендуетсяПеремещён
Ручная очистка работает один раз — потом про неё забывают. Рабочая схема из двух задач 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
Разумные пороги в скрипте мониторинга:
1DISK_THRESHOLD=80
2DISK_CRITICAL=85
Обязательно пиши логи — иначе при пропаже образа не узнаешь, кто его удалил и когда.
crontab -l# Зачем этоУдалён
# Зачем это
Docker не убирает за собой. Каждая сборка оставляет слои, каждый перезапуск — старые образы. На активном сервере десятки гигабайт накапливаются за месяцы, и однажды диск просто кончается. Причём в самый неудачный момент: когда сервису надо перезапуститься.
Но у очистки есть обратная сторона, про которую редко пишут. Она в конце списка, и это самая важная часть.
## Главное: «неиспользуемый» не равно «ненужный»Удалён
## Главное: «неиспользуемый» не равно «ненужный»
Почти вся документация по очистке говорит: «безопасно, удаляются только неиспользуемые ресурсы». Это правда буквально и обманчива по сути.
**Реальный случай.** Сервис в кластере лежал в состоянии `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"
```
## ШпаргалкаУдалён
## Шпаргалка
```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`. Она убирает всё сразу, включая тома. На сервере с боевыми данными её не запускают никогда.