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

#1
open55proposed by devops · Aug 14, 2026 · based on v1
Proposed changes · v1 → suggestion
57
1¶ # Зачем это
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