Очистка Docker: как удалить остановленные контейнеры и образы (docker system prune)
Почему Docker незаметно пожирает все свободное место на диске
Docker обладает особенностью: при обновлении контейнеров старые версии образов (Images), остановленные контейнеры и временные сборочные кэши (Build Cache) не удаляются автоматически. Со временем системная директория /var/lib/docker/ разрастается до сотен гигабайт, приводя к критической системной ошибке «No space left on device». Веб-сайты и базы данных экстренно останавливаются из-за нехватки диска.
Анализ дискового пространства Docker
Узнаем, сколько именно места занимают компоненты Docker:
docker system dfКоманда наглядно покажет размер контейнеров, образов, томов (Volumes) и процент данных, которые можно безопасно удалить (Reclaimable).
Пошаговый регламент очистки диска от мусора Docker
Шаг 1: Быстрая безопасная очистка (docker system prune)
Удалим все остановленные контейнеры, неиспользуемые виртуальные сети и «висячие» (dangling) слои образов без тегов:
docker system prune -f(Эта команда абсолютно безопасна: она не трогает работающие контейнеры и постоянные тома данных).
Шаг 2: Глубокая очистка всех неиспользуемых образов (флаг -a)
Если на диске все еще мало места, удалим вообще ВСЕ скачанные образы, которые не привязаны к работающим прямо сейчас контейнерам:
docker system prune -a -fШаг 3: Экстренная очистка с удалением забытых томов данных (--volumes)
Внимание: Флаг --volumes удалит все независимые постоянные тома, которые не подключены ни к одному контейнеру. Используйте его, если уверены, что в старых томах нет нужных баз данных:
docker system prune -a --volumes -fШаг 4: Очистка гигантских JSON-логов работающих контейнеров
Иногда место забивают не образы, а логи работающего контейнера в формате JSON. Быстро обнулите все лог-файлы контейнеров без их перезапуска:
sudo sh -c 'truncate -s 0 /var/lib/docker/containers/*/*-json.log'Шаг 5: Проверка освобожденного места
df -h /var/lib/docker
docker system dfТиповые ошибки администраторов
- Случайное удаление томов с базой данных: Запуск
docker system prune --volumesна сервере, где база данных была временно остановлена, приведет к безвозвратному удалению тома с таблицами MySQL/PostgreSQL. Перед очисткой всегда проверяйте, что важные контейнеры запущены! - Отсутствие лимитов на логирование в daemon.json: Если не настроить ротацию логов Docker, контейнер с ошибками может генерировать сотни гигабайт текстовых логов за сутки.
Инженеры ITSTM настроят централизованную ротацию логов, автоматическую сборку мусора по расписанию и мониторинг дисковых квот.
Частые вопросы (FAQ)
Удалит ли команда docker system prune работающие контейнеры?
Нет. Команда затрагивает исключительно остановленные контейнеры. Все работающие службы продолжат функционировать без сбоев.
Как удалить только один конкретный старый Docker-образ?
Посмотрите список образов 'docker images', найдите Image ID и удалите его: 'docker rmi ID_образа'.
Как настроить автоматическое ограничение размера логов для всех контейнеров Docker?
В файле /etc/docker/daemon.json пропишите: '{"log-driver": "json-file", "log-opts": {"max-size": "50m", "max-file": "3"}}' и перезапустите docker daemon.
Что такое 'Dangling Images' в Docker?
Это безымянные промежуточные слои образов (отображаются со статусом <none>:<none>), которые остались после пересборки новых версий ваших контейнеров.