Накопление неиспользуемых Docker-образов и их слоев — одна из основных причин неконтролируемого роста дискового пространства на серверах и рабочих станциях DevOps инженеров. В результате система замедляется, сборки занимают больше времени, а обновление инфраструктуры становится рискованным из-за устаревших и потенциально уязвимых образов. Эта статья — практическое руководство, которое поможет не только быстро освободить гигабайты дискового пространства с помощью проверенных команд docker prune, но и глубоко понять архитектуру хранения (OverlayFS), внедрить автоматизированную очистку в CI/CD и обеспечить безопасность через регулярное сканирование образов и обновление базовых слоев.
Проблема: почему дисковое пространство заканчивается и как это оценить
Docker хранит данные в нескольких категориях: образы (images), контейнеры (containers), тома (volumes) и кэш сборки (build cache). Каждый образ состоит из слоев (layers), которые могут дублироваться между разными тегами и версиями. Со временем в системе накапливаются «висячие» (dangling) образы — промежуточные слои без тега, остановленные контейнеры, неиспользуемые тома и огромный кэш от многократных сборок. Это приводит к потере десятков и даже сотен гигабайтов дискового пространства.
Команда `docker system df`: ваш главный инструмент для аудита
Первым шагом в решении проблемы является точная оценка ситуации. Команда docker system df предоставляет сводную информацию о использовании ресурсов Docker.
Пример вывода команды:
TYPE TOTAL ACTIVE SIZE RECLAIMABLE
Images 45 12 4.5GB 2.1GB (47%)
Containers 20 5 780MB 780MB (100%)
Local Volumes 8 3 1.2GB 900MB (75%)
Build Cache 0 0 0B 0B
Ключевые колонки:
- TOTAL: общее количество объектов.
- ACTIVE: количество используемых (например, запущенные контейнеры или образы, на которые они ссылаются).
- SIZE: общий объем дискового пространства.
- RECLAIMABLE: объем, который можно освободить безопасно, удалив неиспользуемые объекты.
Для детального анализа используйте флаг -v (verbose): docker system df -v. Он покажет список всех образов с их размерами, что поможет идентифицировать самые «тяжелые». Сравните эти данные с общей статистикой диска хоста (df -h), чтобы понять масштаб проблемы. Эта же проблема актуальна для Docker Desktop на Windows и Mac, где данные хранятся в виртуальном диске.
Ручная очистка: безопасное удаление неиспользуемых Docker-образов
После оценки объема reclaimable пространства можно приступать к очистке. Важно действовать от самых безопасных методов к более агрессивным, чтобы минимизировать риск удаления критически важных данных.
`docker image prune`: базовая очистка «висячих» образов
Команда docker image prune удаляет «висячие» (dangling) образы — промежуточные слои, которые не имеют связанного с ними тега. Это самая безопасная операция, так как эти образы обычно не используются запущенными контейнеры.
Базовый запуск:
docker image prune
Команда предложит подтверждение удаления. Для автоматизации или предварительного анализа используйте ключевые флаги:
--dry-run: показывает, что будет удалено, без фактического выполнения.-aили--all: удаляет все неиспользуемые образы (не только dangling), включая те, на которые не ссылаются никакие контейнеры. Это более агрессивная очистка.--filter: позволяет фильтровать образы по критериям, например,"until=24h"для удаления образов, созданных более 24 часов назад.--force: не требует подтверждения, полезно для скриптов.
Пример безопасной процедуры:
# 1. Предварительный просмотр
docker image prune --dry-run
# 2. Удаление только dangling образов
docker image prune
# 3. Удаление всех неиспользуемых образов (с осторожностью)
docker image prune -a
`docker system prune`: комплексная очистка системы
Команда docker system prune — мощный инструмент для тотальной очистки всей системы Docker. Она может удалить остановленные контейнеры, неиспользуемые образы, тома и кэш сборки.
Детальный разбор команды с флагами:
docker system prune -a --volumes --filter "until=48h"
-a: удаляет все неиспользуемые объекты, не только dangling.--volumes: КРИТИЧНО ВАЖНЫЙ ФЛАГ. Он удаляет неиспользуемые тома (volumes). Убедитесь, что в них нет важных данных, прежде чем использовать этот флаг.--filter: ограничивает очистку по времени.
Обязательный порядок действий для продакшена:
- Выполните команду с флагом
--dry-runи внимательно проанализируйте вывод. - Если вывод безопасен, запустите команду без
--dry-run, но без флага--volumes, если вы не уверены в томах. - Для удаления конкретных образов по ID или имени используйте точечную команду:
docker image rm [IMAGE_ID]илиdocker rmi [IMAGE_NAME:TAG].
Для получения более подробных инструкций и альтернативных команд обратитесь к нашему руководству по полной очистке Docker.
Архитектура хранения Docker: как слои влияют на диск и производительность
Чтобы управлять пространством эффективно, нужно понимать, как Docker хранит данные на низком уровне. Это позволяет не только реагировать на проблемы, но и профилактически оптимизировать процессы сборки.
Драйвер OverlayFS (overlay2): как это работает в Linux
На современных Linux системах стандартным драйвером хранения является overlay2. Он использует принцип объединения слоев:
- lowerdir: набор слоев базового образа и промежуточных слоев. Это read-only слои.
- upperdir: writeable слои контейнера, где происходят изменения.
- merged: объединенная виртуальная файловая система, которую видит контейнер.
Физически слои хранятся в директории /var/lib/docker/overlay2/. Каждый слой — это отдельный каталог с уникальным ID. Когда команда prune удаляет неиспользуемый образ, она физически удаляет соответствующие каталоги слоев из этой директории. Мониторинг размера /var/lib/docker через инструменты типа du -sh /var/lib/docker/overlay2/ помогает отслеживать рост.
Анализ образа изнутри: используем `dive` для оптимизации Dockerfile
Реактивная очистка — это решение проблемы. Проактивная оптимизация — ее предотвращение. Инструмент dive позволяет визуально анализировать Docker-образы, понимая, какой слой добавляет наибольший вес.
Установка и базовое использование:
# Установка dive (пример для Ubuntu/Debian)
sudo apt install dive
# Анализ образа
dive your-image:tag
Интерфейс dive показывает:
- Общий размер образа и оценку его эффективности.
- Размер каждого слоя.
- Команду в Dockerfile, которая создала этот слой.
Кейс оптимизации: часто большой вес добавляют слои, созданные командами RUN apt-get update && apt-get install -y .... Dive покажет, что кэш apt (/var/cache/apt/) занимает много места. Оптимизация заключается в объединении установки и очистки кэша в одном слое Dockerfile:
RUN apt-get update && apt-get install -y package-name && rm -rf /var/lib/apt/lists/*
Этот подход, вместе с использованием многоэтапных сборок (multi-stage builds), радикально уменьшает итоговый размер образов. Для глубокого погружения в оптимизацию Dockerfile рекомендуем наш гайд по созданию безопасных и эффективных образов. Также подробнее о архитектуре слоев можно узнать в статье «Архитектура Docker-образов».
Автоматизация: скрипты, CI/CD и мониторинг для постоянной чистоты
Ручная очистка — временное решение. Для устойчивого управления пространством необходима автоматизация.
Cron-скрипт для регулярной очистки
Простой bash-скрипт, запускаемый по cron, обеспечивает регулярную очистку без вмешательства администратора.
Пример скрипта /usr/local/bin/docker-cleanup.sh:
#!/bin/bash
LOG_FILE=/var/log/docker-cleanup.log
DATE=$(date)
echo "[$DATE] Starting Docker system prune dry-run..." >> $LOG_FILE
docker system prune --all --volumes --filter "until=7d" --dry-run >> $LOG_FILE
echo "[$DATE] Executing prune..." >> $LOG_FILE
docker system prune --all --filter "until=7d" --force
# Флаг --volumes удален для безопасности данных в томах
# Отправка уведомления (пример для Telegram через curl)
# curl -s -X POST "https://api.telegram.org/botTOKEN/sendMessage" -d "chat_id=CHAT_ID&text=Docker cleanup completed on $(hostname)" >> $LOG_FILE
echo "[$DATE] Cleanup finished." >> $LOG_FILE
Настройка cron задачи для запуска каждое воскресенье в 03:00:
# В файле /etc/crontab добавить
0 3 * * 0 root /usr/local/bin/docker-cleanup.sh
Логирование с --dry-run позволяет проводить аудит и понимать, что было удалено.
Интеграция очистки в пайплайн CI/CD (GitLab CI пример)
В CI/CD пайплайнах, особенно на собственных runner'ах, важно очищать систему после сборок, чтобы предотвратить рост диска.
Пример job в .gitlab-ci.yml:
cleanup:
stage: cleanup
script:
- docker system prune --force --filter "until=24h"
rules:
- if: $CI_PIPELINE_SOURCE == "schedule" # Запускать по расписанию
- if: $CI_COMMIT_BRANCH == "main" # Запускать после сборки на main
when: always
Важно: на shared runner'ах (используемых многими проектами) такая агрессивная очистка может нарушить работу других сборок. Используйте этот подход только на dedicated runner'ах.
Безопасность и стабильность: обновление базовых образов и сканирование на уязвимости
Управление образами в продакшене — это не только вопрос дискового пространства, но и безопасности. Устаревшие базовые образы содержат известные уязвимости (CVE), которые угрожают всей инфраструктуре.
Правила тегирования и работа с базовыми образами Alpine/Ubuntu
Первое правило безопасности — отказаться от тега latest в продакшене. Этот тег нестабилен и может привести к непредсказуемым изменениям в контейнерах.
Вместо этого используйте фиксированные версии минимальных дистрибутивов:
# Вместо
FROM ubuntu:latest
# Используйте
FROM ubuntu:22.04
# Вместо
FROM python:latest
# Используйте
FROM python:3.9-slim-buster
Обновление базового слоя должно быть контролируемым процессом:
- Мониторинг релизов базовых образов (например, через официальные репозитории Docker Hub).
- Обновление версии в Dockerfile (например, с
ubuntu:22.04наubuntu:24.04). - Полная пересборка образов и их тестирование в stage-окружении перед деплоем в production.
Многоэтапная сборка (multi-stage build) позволяет использовать свежий базовый образ для компиляции, но включать в финальный образ только минимальные необходимые бинарные файлы, что дополнительно снижает риски.
Сканирование образов на уязвимости (CVE) с помощью Trivy
Инструмент Trivy от Aqua Security позволяет быстро сканировать Docker-образы на наличие известных уязвимости.
Установка и базовый запуск:
# Установка (пример для Linux)
curl -sfL https://raw.githubusercontent.com/aquasecurity/trivy/main/contrib/install.sh | sh -s -- -b /usr/local/bin
# Сканирование локального образа
trivy image your-registry/your-app:1.0.0
Trivy выдаст отчет с классификацией уязвимости по степени критичности (CRITICAL, HIGH, MEDIUM, LOW). Интеграция сканирования в CI/CD пайплайн позволяет автоматически блокировать сборку или деплой, если обнаружены критические проблемы.
Пример условия в GitLab CI:
security_scan:
stage: test
script:
- trivy image --exit-code 1 --severity HIGH,CRITICAL $CI_REGISTRY_IMAGE:$CI_COMMIT_TAG
allow_failure: false
Если Trivy найдет уязвимости уровня HIGH или CRITICAL, он вернет exit code 1, что приведет к остановке пайплайна.
Специфичные сценарии: Docker Desktop на Windows и контейнеры в TrueNAS
Не все среды являются стандартными Linux серверами. Особенности управления образами в Docker Desktop и в NAS-системах требуют отдельного внимания.
Освобождение места в Docker Desktop для Windows/Mac
Docker Desktop на Windows и Mac использует виртуальный диск (файл .vhdx на Windows, .raw на Mac) для хранения всех данных Docker. Его размер может автоматически увеличиваться, но не уменьшается после удаления образов.
Очистка через графический интерфейс:
- Откройте Docker Desktop Dashboard.
- Перейдите в раздел «Troubleshoot».
- Нажмите «Clean / Purge data». Это удалит все образы, контейнеры, тома и кэш, эффективно уменьшив размер виртуального диска.
Очистка через CLI внутри WSL2 (Windows) или напрямую в PowerShell:
# Команды внутри WSL2 или PowerShell работают аналогично Linux
docker system prune -a
# Для полного очищения (включая остановленные контейнеры и build cache)
docker system prune -a --volumes
Если виртуальный диск достиг максимального размера, его можно увеличить в настройках Docker Desktop (Settings -> Resources -> Advanced).
Для комплексного понимания работы Docker в современных средах рекомендуем ознакомиться с полным руководством по Docker для DevOps и продвинутым гайдом по безопасности и оптимизации.