Восстановление Docker после сбоя в 2026: ошибки демона, нехватка места и повреждение образов | AdminWiki
Timeweb Cloud — сервера, Kubernetes, S3, Terraform. Лучшие цены IaaS.
Попробовать

Восстановление Docker после сбоя в 2026: ошибки демона, нехватка места и повреждение образов

05 мая 2026 8 мин. чтения

Сбой Docker Engine в рабочей среде - это критическая ситуация, которая приводит к простою сервисов и потере данных. В 2026 году основные причины остаются прежними: падение демона, нехватка дискового пространства и повреждение локальных образов. Это руководство содержит проверенные алгоритмы диагностики и восстановления для каждой из этих проблем. Вы получите конкретные команды для анализа логов, безопасной очистки диска, переустановки Docker с сохранением данных и настройки профилактики. Инструкции написаны для практикующих системных администраторов и DevOps-инженеров и позволяют восстановить работоспособность контейнерной инфраструктуры с минимальным временем простоя.

Экстренная диагностика: определяем тип сбоя Docker

Первое действие при любой ошибке Docker - точное определение её типа. Неправильная диагностика ведет к потере времени и риску усугубить проблему. Используйте этот алгоритм для быстрой классификации.

Анализ логов и ошибки запуска демона Docker

Если команды docker ps или docker info возвращают ошибку подключения к демону, проблема в работе Docker Engine. Запустите проверку статуса службы и просмотр логов.

systemctl status docker

Команда покажет, активна ли служба. Ключевые состояния: active (running), failed, inactive (dead). Если служба неактивна, попробуйте её запустить и сразу посмотреть логи за последний час:

sudo systemctl start docker
journalctl -u docker --since "1 hour ago" -f

В логах ищите критические сообщения:

  • "Failed to start Docker Application Container Engine." - общая ошибка запуска.
  • "Error starting daemon: error initializing graphdriver" - проблема с драйвером хранения (overlay2, devicemapper). Часто связана с повреждением файловой системы в /var/lib/docker.
  • "Cannot connect to the Docker daemon" - демон не запущен или недоступен через сокет.
  • Указания на конкретный конфигурационный файл, например, /etc/docker/daemon.json. Ошибка синтаксиса в этом файле блокирует запуск демона. Проверьте его валидность командой sudo docker --config /etc/docker daemon --validate или временно переименуйте файл для теста.

Если демон запускается, но контейнеры не работают, переходите к следующему шагу.

Как проверить, что проблема в нехватке дискового пространства

Ошибка "No space left on device" - самая распространенная причина сбоев в долго работающих средах. Сначала проверьте общую заполненность диска, на котором расположен каталог Docker (обычно /var/lib/docker).

df -h /var/lib/docker

Если использование близко к 100%, проанализируйте, что именно занимает место в подсистеме Docker. Для этого используйте встроенную утилиту:

docker system df -v

Команда выведет детальный отчет по четырем категориям:

  1. Images: Загруженные образы и их слои. Ищите образы без тегов (помечены как <none>), которые часто остаются после сборок.
  2. Containers: Запущенные и остановленные контейнеры. Остановленные контейнеры сохраняют свою файловую систему и могут занимать гигабайты.
  3. Local Volumes: Тома, не привязанные к контейнерам. Их размер нужно проверять отдельно.
  4. Build Cache: Кэш сборки образов. Может разрастаться до десятков гигабайт в активных CI/CD-средах.

Сочетание этих двух проверок (df -h и docker system df) точно укажет, является ли нехватка места корневой причиной сбоя. Для комплексного управления контейнерами, включая их остановку, перезапуск и мониторинг ресурсов, обратитесь к нашему практическому руководству по управлению Docker-контейнерами.

Безопасная очистка диска: освобождаем место без потери данных

После подтверждения нехватки места начинайте очистку с наименее рискованных действий, постепенно переходя к более агрессивным. Цель - освободить пространство, не удалив нужные volumes или образы.

Пошаговое использование docker system prune и docker image prune

Команда docker system prune - основной инструмент очистки. Она удаляет остановленные контейнеры, образы без тегов (dangling images) и неиспользуемые сети. По умолчанию тома не затрагиваются. Перед выполнением любой команды очистки всегда используйте флаг --dry-run, чтобы увидеть, что будет удалено.

docker system prune --dry-run

Если список удаляемых объектов безопасен, выполните очистку:

docker system prune -f

Для более глубокой очистки, включающей все неиспользуемые образы (не только dangling), а также кэш сборки, используйте команды с флагом -a и --all.

# Удалить все неиспользуемые образы
docker image prune -a
# Удалить кэш сборщика
docker builder prune

Внимание: Флаг --volumes для команды docker system prune удалит все тома, не используемые хотя бы одним контейнером. Это потенциально опасная операция. Используйте её только если вы уверены в том, какие тома можно удалить, или после создания бэкапа. Полную инструкцию по безопасной очистке всех компонентов Docker вы найдете в нашем отдельном руководстве: Полная очистка Docker: удаление контейнеров, образов и томов.

Что делать, если очистка не помогла: ищем "тяжелые" volumes и логи

Если стандартный prune не освободил достаточно места, проблема может быть в больших файлах внутри volumes или в разросшихся логах контейнеров. Сначала определите, какие тома самые объемные. Прямого способа посмотреть размер тома через Docker CLI нет, но можно найти его каталог в файловой системе:

sudo du -sh /var/lib/docker/volumes/* | sort -hr | head -10

Эта команда покажет десять самых больших каталогов с томами. Для анализа содержимого конкретного тома смонтируйте его во временный контейнер:

docker run -it --rm -v имя_тома:/data alpine sh -c "du -sh /data/*"

Второй источник - логи контейнеров. По умолчанию Docker использует драйвер журналирования json-file, который не ограничивает размер лог-файлов. Проверьте размер логов:

sudo find /var/lib/docker/containers -type f -name "*.log" -exec du -ch {} + | tail -1

Для ротации логов настройте драйвер json-file с ограничениями в /etc/docker/daemon.json или переключитесь на драйвер local, который по умолчанию выполняет ротацию.

Восстановление после падения демона Docker и повреждения данных

Когда демон не запускается из-за критической ошибки или образы повреждены, требуется более глубокое вмешательство. Главный принцип - сохранить пользовательские данные (volumes) любой ценой.

Полная переустановка Docker Engine с сохранением volumes

Если логи демона указывают на неустранимую ошибку графдрайвера или повреждение метаданных, переустановка - самый быстрый путь. Следуйте этому чек-листу.

  1. Остановите службу Docker: sudo systemctl stop docker. Убедитесь, что все контейнеры остановлены: docker ps -a (если демон частично отвечает).
  2. Создайте резервную копию volumes: Это самый важный шаг. Все пользовательские данные хранятся в /var/lib/docker/volumes/. Скопируйте этот каталог в безопасное место.
    sudo cp -rp /var/lib/docker/volumes /backup/path/docker_volumes_backup_$(date +%Y%m%d)
  3. Удалите пакеты Docker: Команды зависят от дистрибутива. Для Ubuntu/Debian:
    sudo apt-get purge -y docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
    Используйте purge, а не remove, чтобы удалить файлы конфигурации.
  4. Очистите остаточные файлы (опционально, но рекомендуется): Удалите каталог Docker. Внимание: Это удалит все образы, контейнеры и сети. Данные в volumes уже скопированы.
    sudo rm -rf /var/lib/docker
  5. Установите Docker заново: Следуйте официальной инструкции для вашего дистрибутива или используйте скрипт установки.
  6. Восстановите volumes из бэкапа: Остановите демон (sudo systemctl stop docker), скопируйте сохраненные volumes обратно в /var/lib/docker/, убедитесь, что права доступа корректны (обычно root:root), и запустите демон снова.
  7. Проверьте целостность данных: Запустите контейнер, использующий восстановленный том, и убедитесь, что данные на месте.

Как восстановить поврежденные образы и реестр данных

Повреждение образа проявляется ошибками вида "Error response from daemon: layer does not exist" или "failed to register layer" при запуске контейнера. Решение - принудительно удалить проблемный образ и загрузить его заново.

# Найти ID проблемного образа
docker images
# Принудительно удалить его
docker rmi -f <image_id>
# Загрузить заново из registry
docker pull <image_name:tag>

Если повреждение затрагивает множество образов или реестр данных, можно очистить всё хранилище образов. Это удалит все локальные образы и контейнеры. Предварительно убедитесь, что у вас есть Dockerfile или известны точные теги образов для последующей загрузки.

sudo systemctl stop docker
sudo rm -rf /var/lib/docker/image
sudo systemctl start docker

После этого вам потребуется заново выполнить docker pull для всех необходимых образов. Для эффективного управления этим процессом в продакшене, включая политики хранения и обновления образов, изучите наше руководство по управлению Docker-образами в продакшене.

Профилактика сбоев: настройка мониторинга и регулярное обслуживание

Лучшее лечение - профилактика. Настройка мониторинга и автоматической очистки избавит от неожиданных сбоев из-за нехватки места.

Настройка алертов на нехватку места и скрипты автоматической очистки

Создайте простой скрипт для cron, который будет проверять заполненность раздела с Docker и выполнять безопасную очистку, если свободного места осталось меньше заданного порога (например, 10%).

#!/bin/bash
THRESHOLD=90
USAGE=$(df /var/lib/docker | awk 'NR==2 {print $5}' | sed 's/%//')
if [ $USAGE -gt $THRESHOLD ]; then
    echo "[$(date)] Disk usage for Docker is at ${USAGE}%. Running prune." >> /var/log/docker-clean.log
    docker system prune -a -f --filter "until=24h"
    docker builder prune -a -f
fi

Этот скрипт удалит все остановленные контейнеры и образы, которые не использовались последние 24 часа, а также кэш сборки. Добавьте его в планировщик cron для ежедневного выполнения. Для более продвинутого мониторинга интегрируйте метрики Docker (доступные через docker system df --format='{{json .}}') в Prometheus и настройте алерты в Grafana или Alertmanager.

Чек-лист для подготовки к возможным сбоям

Подготовьте эти артефакты заранее, чтобы ускорить восстановление:

  • Документация расположения данных: Знайте, где хранятся volumes (/var/lib/docker/volumes/), образы и конфигурация демона (/etc/docker/).
  • Актуальные docker-compose.yml файлы: Храните их в системе контроля версий (Git). Они содержат точные спецификации ваших сервисов.
  • Настроенные бэкапы volumes: Реализуйте регулярное резервное копирование каталогов volumes или используйте специализированные утилиты. Автоматизируйте этот процесс.
  • Документация нестандартной конфигурации: Зафиксируйте все изменения в /etc/docker/daemon.json, настройки драйверов хранения или сети.
  • Политики хранения образов в registry: Настройте автоматическое удаление старых тегов в вашем container registry (Harbor, GitLab, Nexus) чтобы предотвратить накопление.

Следование этим практикам, наряду с базовым пониманием работы Docker, которое можно получить из нашего полного практического руководства по Docker, создаст устойчивую контейнерную среду. Для комплексной проверки безопасности вашей инфраструктуры после восстановления используйте чек-лист аудита безопасности Docker и Kubernetes.

Автоматизация рутинных задач администрирования, включая мониторинг и очистку, высвобождает время для решения более сложных проблем. Для интеграции ИИ-моделей в ваши процессы разработки и администрирования рассмотрите использование агрегатора API, такого как AiTunnel, который предоставляет единый доступ к множеству моделей, включая GPT, Gemini и Claude, с удобным управлением и оплатой в рублях.

Поделиться:
Сохранить гайд? В закладки браузера