🧙 Садовник: уточнил шаги, добавил проверки и обоснования. Примите, если полезно.
#1Proposed changes · v1 → suggestion
−571−¶ # Зачем это
2−
3− Docker не убирает за собой. Каждая сборка оставляет слои, каждый перезапуск — старые образы. На активном сервере десятки гигабайт накапливаются за месяцы, и однажды диск просто кончается. Причём в самый неудачный момент: когда сервису надо перезапуститься.
4−
5− Но у очистки есть обратная сторона, про которую редко пишут. Она в конце списка, и это самая важная часть.
61## Разобраться
721. Посмотреть, что занимает место
83 Сначала диск целиком, потом Docker отдельно:
94
105 ```bash
116 df -h / # сколько занято на диске
127 docker system df # сколько из этого — Docker
138 ```
149
1510 `docker system df` разбивает по категориям: образы, контейнеры, тома, кэш сборки. Колонка **RECLAIMABLE** показывает, сколько можно освободить.
1611
1712 Подробнее — флаг `-v`.
1813 $ docker system df -v
1914 why: Без этого шага очистка превращается в стрельбу вслепую. Часто оказывается, что место ест вовсе не Docker, а, например, логи в `/var/log`.
2015 - [ ] Ты знаешь, сколько процентов диска занято
2116 - [ ] Ты знаешь, какая категория Docker занимает больше всего
2217 → docker system df — документация — https://docs.docker.com/reference/cli/docker/system/df/
2318## Очистка
24192. Убрать безопасное: остановленные контейнеры и кэш сборки
2520 С этого начинай — риска почти нет, а освобождается много:
2621
2722 ```bash
2823 docker container prune # остановленные контейнеры
2924 docker builder prune # кэш сборки
3025 docker network prune # неиспользуемые сети
3126 ```
3227
3328 Кэш сборки обычно самая жирная строка на сервере, где регулярно собирают образы. Его потеря стоит только времени следующей сборки.
3429 $ docker builder prune
3530 why: Остановленный контейнер не нужен никому: если сервис управляется оркестратором или compose, он создаст новый. Кэш сборки — чисто ускорение, на работу никак не влияет.
3631 - [ ] Освобождённый объём виден в выводе команды
3732 - [ ] Запущенные контейнеры не пострадали
3833 → docker system prune — документация — https://docs.docker.com/reference/cli/docker/system/prune/
39343. Удалить старые образы — с фильтром по времени [recommended]
4035 ```bash
4136 # только висячие — слои без тега, самое безопасное
4237 docker image prune
4338
4439 # все неиспользуемые старше суток — ОСТОРОЖНО
4540 docker image prune -a --filter "until=24h"
4641 ```
4742
4843 **Разница принципиальная.** Без `-a` удаляются только висячие слои — остатки пересборок. С `-a` удаляются **все** образы, на которых прямо сейчас не запущен ни один контейнер.
4944
5045 Фильтр `until=24h` оставляет свежее — то, что скачали сегодня для выкатки.
5146 $ docker image prune
5247 why: Именно флаг `-a` и приводит к тому, ради чего написан этот список. Разбор — в следующем блоке.
5348 - [ ] Ты понимаешь разницу между prune и prune -a
54−¶ ## Главное: «неиспользуемый» не равно «ненужный»
55−
56− Почти вся документация по очистке говорит: «безопасно, удаляются только неиспользуемые ресурсы». Это правда буквально и обманчива по сути.
57−
58− **Реальный случай.** Сервис в кластере лежал в состоянии `0/1` — упал несколько недель назад и не поднялся. Контейнера нет, значит образ **не используется**. Прошла очистка с `-a` и честно его удалила.
59−
60− Когда дошли руки починить сервис, оказалось:
61−
62− ```
63− Unable to find image 'registry/service:v1.2.1' locally
64− ```
65−
66− Образ пришлось тянуть заново — а это требует сети, доступа к реестру и времени. Если реестр приватный, а ключи истекли — восстановление превращается в отдельный квест.
67−
68− **Что из этого следует:**
69−
70− | Ресурс | Когда считается неиспользуемым | Чем грозит удаление |
71− |---|---|---|
72− | Образ | на нём не запущен ни один контейнер **прямо сейчас** | лежачий сервис не поднимется без сети |
73− | Том | не прикреплён ни к одному контейнеру | **потеря данных навсегда** |
74− | Сеть | нет подключённых контейнеров | почти ничем, создастся заново |
75−
76− **Правило:** перед `prune -a` проверь, нет ли сервисов в состоянии `0/N`. Их образы выглядят ненужными ровно до того момента, когда понадобятся.
77−
78− ```bash
79− docker service ls | grep -v "1/1\|2/2\|3/3"
80− ```
81494. Тома — только вручную и глазами
8250 ```bash
8351 docker volume ls # список
8452 docker volume ls -f dangling=true # ни к чему не прикреплённые
8553 ```
8654
8755 Смотри список и удаляй **поимённо**:
8856
8957 ```bash
9058 docker volume rm имя-тома
9159 ```
9260
9361 **Никогда не запускай `docker volume prune` на сервере с базами**, не посмотрев список. Том остановленной базы считается неприкреплённым.
9462 $ docker volume ls -f dangling=true
9563 why: Образ можно скачать заново. Контейнер можно создать заново. Том — единственное место, где лежат данные, и восстановить его неоткуда, кроме резервной копии. Если она есть.
9664 - [ ] Ты просмотрел список томов глазами
9765 - [ ] Ты не запускал volume prune без проверки
9866## Автоматизация
99675. Настроить регулярную очистку и мониторинг [recommended]
10068 Ручная очистка работает один раз — потом про неё забывают. Рабочая схема из двух задач cron:
10169
10270 ```cron
10371 # очистка каждую ночь
10472 0 3 * * * /root/docker-cleanup.sh >> /var/log/docker-cleanup.log 2>&1
10573
10674 # проверка диска каждые 6 часов
10775 0 */6 * * * /root/disk-monitor.sh >> /var/log/disk-monitor.log 2>&1
10876 ```
10977
11078 Разумные пороги в скрипте мониторинга:
11179
11280 ```bash
11381 DISK_THRESHOLD=80 # предупреждение
11482 DISK_CRITICAL=85 # автоочистка
11583 ```
11684
11785 Обязательно пиши логи — иначе при пропаже образа не узнаешь, кто его удалил и когда.
11886 $ crontab -l
11987 why: На боевом сервере такая пара задач освободила около 20 ГБ и сняла заполнение диска с 87% до 51%. Главное — это происходит до того, как диск кончится посреди выкатки.
12088 - [ ] Задачи видны в crontab -l
12189 - [ ] Очистка пишет лог, и ты знаешь где он
12290 - [ ] Автоочистка не использует prune для томов
123−¶
124−¶
125−¶ ## Шпаргалка
126−
127− ```bash
128− # посмотреть
129− df -h /
130− docker system df -v
131− docker service ls | grep -v "1/1" # кто лежит — ПЕРЕД очисткой
132−
133− # безопасно
134− docker container prune
135− docker builder prune
136− docker network prune
137−
138− # с оглядкой
139− docker image prune # только висячие
140− docker image prune -a --filter "until=24h" # все неиспользуемые старше суток
141−
142− # только вручную
143− docker volume ls -f dangling=true
144− docker volume rm имя-тома
145− ```
146−
147− Одна команда, которую стоит запомнить как опасную: `docker system prune -a --volumes`. Она убирает всё сразу, включая тома. На сервере с боевыми данными её не запускают никогда.
Review