Исчерпывающий гайд: Очистка дискового пространства от ненужных Docker данных
-
Docker со временем накапливает значительное количество данных - образы, контейнеры, тома и кэш сборки могут разрастаться до десятков гигабайт, замедляя работу системы. В этом подробном руководстве вы узнаете, как эффективно и безопасно управлять дисковым пространством Docker.
Понимание архитектуры Docker-данных
Основные компоненты, занимающие дисковое пространство
Images (Образы) - представляют собой многослойные шаблоны для создания контейнеров. Они включают базовую операционную систему, приложения и зависимости. Каждый образ может занимать от сотен мегабайт до нескольких гигабайт. Docker использует систему слоев, где общие компоненты переиспользуются между образами для экономии места.
Containers (Контейнеры) - это работающие экземпляры образов. Даже остановленные контейнеры продолжают занимать место, сохраняя изменения файловой системы, логи и временные данные. Размер контейнера может варьироваться от мегабайт до гигабайт в зависимости от активности приложения.
Volumes (Тома) - обеспечивают постоянное хранение данных. Они сохраняются даже после удаления контейнера и могут содержать критически важную информацию приложений. Тома могут разрастаться от мегабайт до терабайт.
Networks (Сети) - создают конфигурации сетевых подключений между контейнерами. Хотя они занимают минимальное дисковое пространство, создают записи в системе и могут накапливаться со временем.
Build Cache (Кэш сборки) - содержит промежуточные слои, созданные во время сборки образов. Ускоряет повторную сборку, но может занимать гигабайты дискового пространства.
Диагностика использования дискового пространства
Первым шагом всегда должна быть комплексная диагностика текущего состояния системы:
# Общий обзор использования места Docker docker system df # Детальная информация с разбивкой по ресурсам docker system df -vКоманда
docker system dfпоказывает сводную информацию по всем типам ресурсов Docker и указывает объем места, который можно освободить. Флаг -v предоставляет детализированный отчет по каждому компоненту.Анализ логов контейнеров
Docker логи могут стать неожиданным потребителем дискового пространства. Логи по умолчанию хранятся без ограничений и могут разрастись до гигабайт:
# Найти путь к логам конкретного контейнера docker inspect --format='{{.LogPath}}' <container_name> # Проверить размер всех логов sudo du -sh /var/lib/docker/containers/*/*-json.log # Найти самые большие лог-файлы sudo find /var/lib/docker/containers/ -name "*-json.log" -exec du -sh {} + | sort -hr | head -10Детальный анализ компонентов
# Список образов с размерами и временем создания docker images --format "table {{.Repository}}\t{{.Tag}}\t{{.Size}}\t{{.CreatedAt}}" # Контейнеры с информацией о размере docker ps -s -a # Информация о томах docker volume ls docker system df -v | grep "Local Volumes" -A 20 # Анализ кэша сборки docker builder duКоманды очистки по уровням безопасности
Уровень 1: Безопасная очистка
Эти команды можно выполнять без опасений потери важных данных:Что удаляется при docker system prune:
- Все остановленные контейнеры
- Все сети, не используемые минимум одним контейнером
- Все dangling образы
- Весь кэш сборки
Уровень 2: Средний риск
Эти команды более агрессивны, но относительно безопасны:# Удаление ВСЕХ неиспользуемых образов (не только dangling) docker image prune -a # Системная очистка с удалением всех неиспользуемых образов docker system prune -a # Принудительное выполнение без подтверждения docker system prune -fУровень 3: Высокий риск
️ ВНИМАНИЕ: Эти команды могут привести к потере данных:# Удаление неиспользуемых томов (МОЖЕТ УДАЛИТЬ ДАННЫЕ!) docker volume prune # Системная очистка с удалением томов docker system prune --volumes # Максимально агрессивная очистка docker system prune -a --volumesПродвинутые техники фильтрации
Фильтрация по времени
Docker поддерживает фильтрацию ресурсов по времени создания:
# Удалить образы старше 24 часов docker image prune --filter "until=24h" # Удалить контейнеры старше недели docker container prune --filter "until=168h" # Системная очистка ресурсов старше 72 часов docker system prune --filter "until=72h" # Различные форматы времени docker system prune --filter "until=2024-01-01T00:00:00" docker system prune --filter "until=1h30m"Фильтрация по меткам
Использование меток для селективной очистки:
# Удалить ресурсы с определенной меткой docker system prune --filter "label=environment=testing" # Удалить ресурсы БЕЗ определенной метки docker system prune --filter "label!=environment=production" # Комбинирование фильтров docker image prune --filter "until=24h" --filter "label=temporary=true"Управление логами контейнеров
Безопасная очистка логов
Логи контейнеров могут занимать значительное пространство:
# Безопасное обнуление логов без остановки контейнеров sudo truncate -s 0 /var/lib/docker/containers/*/*-json.log # Очистка логов конкретного контейнера sudo truncate -s 0 $(docker inspect --format='{{.LogPath}}' <container_name>) # Проверка размера логов перед очисткой sudo du -ch /var/lib/docker/containers/*/*-json.log | grep totalАвтоматическое ограничение размера логов
Настройка глобальных ограничений в
/etc/docker/daemon.json:{ "log-driver": "json-file", "log-opts": { "max-size": "10m", "max-file": "3" } }Настройка для отдельных контейнеров
# При запуске контейнера с ограничениями логов docker run --log-opt max-size=50m --log-opt max-file=5 <image_name># В docker-compose.yml version: '3' services: app: image: myapp logging: driver: "json-file" options: max-size: "10m" max-file: "3"Тип ресурса Команда очистки Уровень риска Потенциальная экономия Остановленные контейнеры docker container pruneНизкий 100MB - 10GB Dangling образы docker image pruneНизкий 500MB - 50GB Все неиспользуемые образы docker image prune -aСредний 1GB - 100GB Неиспользуемые тома docker volume pruneВысокий 100MB - 1TB Кэш сборки docker builder pruneНизкий 500MB - 20GB Сети docker network pruneНизкий <1MB -
Автоматизация и мониторинг
Создание скриптов автоматической очистки
#!/bin/bash # docker-maintenance.sh - Скрипт регулярного обслуживания LOG_FILE="/var/log/docker-cleanup.log" DATE=$(date '+%Y-%m-%d %H:%M:%S') echo "[$DATE] Начало очистки Docker" >> $LOG_FILE # Получение статистики до очистки BEFORE=$(docker system df --format "{{.Size}}" | head -1) # Остановка неиспользуемых контейнеров старше 24 часов docker container prune --filter "until=24h" -f # Удаление образов старше недели docker image prune --filter "until=168h" -f # Очистка кэша сборки docker builder prune -f # Очистка сетей docker network prune -f # Логирование результатов AFTER=$(docker system df --format "{{.Size}}" | head -1) echo "[$DATE] Завершение очистки. До: $BEFORE, После: $AFTER" >> $LOG_FILEНастройка cron для регулярной очистки
# Редактирование crontab crontab -e # Ежедневная базовая очистка в 02:00 0 2 * * * /usr/local/bin/docker system prune -f >/dev/null 2>&1 # Еженедельная агрессивная очистка по воскресеньям в 03:00 0 3 * * 0 /usr/local/bin/docker system prune -a -f >/dev/null 2>&1 # Очистка логов каждые 6 часов 0 */6 * * * /usr/bin/truncate -s 0 /var/lib/docker/containers/*/*-json.log 2>/dev/nullМониторинг дискового пространства
#!/bin/bash # docker-space-monitor.sh - Мониторинг и алерты THRESHOLD=85 DOCKER_ROOT="/var/lib/docker" USAGE=$(df $DOCKER_ROOT | tail -1 | awk '{print $5}' | sed 's/%//') if [ $USAGE -gt $THRESHOLD ]; then echo "⚠️ ВНИМАНИЕ: Docker использует ${USAGE}% дискового пространства!" echo "📊 Детальная статистика:" docker system df echo "" echo "🧹 Рекомендуемые действия:" echo "1. docker system prune -f" echo "2. docker image prune -a -f" echo "3. Проверить логи: sudo du -sh /var/lib/docker/containers/*/*-json.log" # Отправка уведомления (настроить под вашу систему) # curl -X POST -H 'Content-type: application/json' \ # --data '{"text":"Docker disk usage: '${USAGE}'%"}' \ # YOUR_WEBHOOK_URL fi -
Специфические проблемы и решения
Проблемы с WSL2 и Docker Desktop
В Windows с WSL2 Docker может не освобождать место сразу после очистки:[^19]
# В PowerShell (от имени администратора) # Остановить WSL2 wsl --shutdown # Компактировать VHDX файл Optimize-VHD -Path "C:\Users\%USERNAME%\AppData\Local\Docker\wsl\data\ext4.vhdx" -Mode Full # Альтернативный способ через diskpart # diskpart # select vdisk file="C:\Users\%USERNAME%\AppData\Local\Docker\wsl\data\ext4.vhdx" # attach vdisk readonly # compact vdisk # detach vdiskОчистка overlay2 директории
Если папка
/var/lib/docker/overlay2занимает критично много места:[^20]# Проверка размера overlay2 sudo du -sh /var/lib/docker/overlay2 # Поиск самых больших директорий sudo du -sh /var/lib/docker/overlay2/* | sort -hr | head -20 # Безопасная очистка только через Docker команды docker system prune -a --volumes # ⚠️ КРАЙНЯЯ МЕРА: полная переустановка Docker sudo systemctl stop docker sudo rm -rf /var/lib/docker sudo systemctl start dockerПроблемы с зависшими процессами
# Поиск и завершение зависших Docker процессов sudo pkill -f docker sudo systemctl restart docker # Очистка после аварийного завершения docker system prune --volumes docker network prune # Проверка целостности Docker docker system infoОптимизация образов для экономии места
Лучшие практики в Dockerfile
# ❌ Плохо: множество слоев FROM ubuntu:20.04 RUN apt-get update RUN apt-get install -y python3 RUN apt-get install -y python3-pip RUN pip3 install flask RUN rm -rf /var/lib/apt/lists/* # ✅ Хорошо: минимальное количество слоев с очисткой FROM ubuntu:20.04 RUN apt-get update && \ apt-get install -y python3 python3-pip && \ pip3 install flask && \ rm -rf /var/lib/apt/lists/* && \ apt-get cleanИспользование многоэтапной сборки
# Этап сборки FROM golang:1.19 AS builder WORKDIR /app COPY . . RUN go build -o main # Финальный образ FROM alpine:latest RUN apk --no-cache add ca-certificates WORKDIR /root/ COPY --from=builder /app/main . CMD ["./main"]Выбор оптимальных базовых образов
Базовый образ Размер Рекомендация ubuntu:20.04~72MB Для разработки alpine:latest~5MB Для production scratch0MB Для статических бинарников distroless~20MB Для безопасности -
Безопасность и лучшие практики
Чек-лист перед очисткой
Создать резервные копии критически важных данных из томов
Проверить активные контейнеры - docker ps
Убедиться в отсутствии важных образов без тегов
Проверить зависимости между образами
Уведомить команду о плановой очистке в production
Безопасный порядок очистки
#!/bin/bash # safe-cleanup-procedure.sh echo "🔍 Фаза 1: Анализ текущего состояния" docker system df docker ps -a docker images echo -e "\n⏸️ Фаза 2: Остановка неиспользуемых контейнеров" read -p "Остановить все контейнеры? (y/N): " -n 1 -r if [[ $REPLY =~ ^[Yy]$ ]]; then docker stop $(docker ps -q) fi echo -e "\n🧹 Фаза 3: Базовая очистка" read -p "Выполнить базовую очистку? (y/N): " -n 1 -r if [[ $REPLY =~ ^[Yy]$ ]]; then docker container prune -f docker network prune -f docker image prune -f fi echo -e "\n🔥 Фаза 4: Агрессивная очистка образов" read -p "Удалить ВСЕ неиспользуемые образы? (y/N): " -n 1 -r if [[ $REPLY =~ ^[Yy]$ ]]; then docker image prune -a -f fi echo -e "\n⚠️ Фаза 5: Очистка томов (ОПАСНО!)" read -p "Удалить неиспользуемые тома? (y/N): " -n 1 -r if [[ $REPLY =~ ^[Yy]$ ]]; then echo "Список томов для удаления:" docker volume ls --filter dangling=true read -p "Подтвердите удаление томов (введите 'DELETE'): " confirm if [ "$confirm" = "DELETE" ]; then docker volume prune -f fi fi echo -e "\n✅ Очистка завершена. Итоговая статистика:" docker system dfTroubleshooting и восстановление
Восстановление после ошибок очистки
# Если Docker не запускается после очистки sudo systemctl status docker sudo journalctl -u docker --no-pager -l # Пересоздание Docker daemon конфигурации sudo systemctl stop docker sudo rm -rf /var/lib/docker/tmp/* sudo systemctl start docker # Проверка целостности docker system info docker versionВосстановление удаленных образов
# Быстрое восстановление часто используемых образов docker pull alpine:latest docker pull ubuntu:20.04 docker pull nginx:latest docker pull postgres:14 # Пересборка локальных образов из Dockerfile docker build -t myapp:latest . # Импорт из резервной копии docker load < backup-images.tar -
@Jspi благодарю, полезная информация!
Но признаться честно, я очень редко пользуюсь докером
-
Безопасность и лучшие практики
Чек-лист перед очисткой
Создать резервные копии критически важных данных из томов
Проверить активные контейнеры - docker ps
Убедиться в отсутствии важных образов без тегов
Проверить зависимости между образами
Уведомить команду о плановой очистке в production
Безопасный порядок очистки
#!/bin/bash # safe-cleanup-procedure.sh echo "🔍 Фаза 1: Анализ текущего состояния" docker system df docker ps -a docker images echo -e "\n⏸️ Фаза 2: Остановка неиспользуемых контейнеров" read -p "Остановить все контейнеры? (y/N): " -n 1 -r if [[ $REPLY =~ ^[Yy]$ ]]; then docker stop $(docker ps -q) fi echo -e "\n🧹 Фаза 3: Базовая очистка" read -p "Выполнить базовую очистку? (y/N): " -n 1 -r if [[ $REPLY =~ ^[Yy]$ ]]; then docker container prune -f docker network prune -f docker image prune -f fi echo -e "\n🔥 Фаза 4: Агрессивная очистка образов" read -p "Удалить ВСЕ неиспользуемые образы? (y/N): " -n 1 -r if [[ $REPLY =~ ^[Yy]$ ]]; then docker image prune -a -f fi echo -e "\n⚠️ Фаза 5: Очистка томов (ОПАСНО!)" read -p "Удалить неиспользуемые тома? (y/N): " -n 1 -r if [[ $REPLY =~ ^[Yy]$ ]]; then echo "Список томов для удаления:" docker volume ls --filter dangling=true read -p "Подтвердите удаление томов (введите 'DELETE'): " confirm if [ "$confirm" = "DELETE" ]; then docker volume prune -f fi fi echo -e "\n✅ Очистка завершена. Итоговая статистика:" docker system dfTroubleshooting и восстановление
Восстановление после ошибок очистки
# Если Docker не запускается после очистки sudo systemctl status docker sudo journalctl -u docker --no-pager -l # Пересоздание Docker daemon конфигурации sudo systemctl stop docker sudo rm -rf /var/lib/docker/tmp/* sudo systemctl start docker # Проверка целостности docker system info docker versionВосстановление удаленных образов
# Быстрое восстановление часто используемых образов docker pull alpine:latest docker pull ubuntu:20.04 docker pull nginx:latest docker pull postgres:14 # Пересборка локальных образов из Dockerfile docker build -t myapp:latest . # Импорт из резервной копии docker load < backup-images.tarтакое писать опасно, а то не возьмут в бигтех)
© 2024 - 2025 ExLends, Inc. Все права защищены.