Docker: no space left on device — как найти, что заняло диск, и очистить безопасно

Введение​


Ошибка "no space left on device" в Docker — частое явление, особенно на серверах с ограниченным дисковым пространством. Причиной может быть накопление неиспользуемых объектов, таких как образы, контейнеры, тома и сети. Эта проблема особенно актуальна в средах, где Docker используется для запуска множества контейнеров, например, в CI/CD-пайплайнах или тестовых средах.

В этой статье мы рассмотрим, как диагностировать использование дискового пространства Docker, какие объекты занимают место и как безопасно очистить систему от ненужных данных.

Как проверить использование диска Docker​


Команда docker system df предоставляет информацию о том, сколько места занимает каждый тип объектов Docker. Это полезно для понимания, где именно происходит утечка дискового пространства.

Bash:
$ docker system df

Пример вывода:

Код:
TYPE        TOTAL   ACTIVE  SIZE    RECLAIMABLE
Images      5       2       16.43 MB 11.63 MB (70%)
Containers  2       0       212 B   212 B (100%)
Local Volumes 2       1       36 B    0 B (0%)

Чтобы получить более подробную информацию, используйте флаг -v:

Bash:
$ docker system df -v

Вывод будет содержать детали по каждому объекту:

  • SHARED SIZE — размер общих данных между образами.
  • UNIQUE SIZE — размер данных, уникальных для конкретного образа.
  • SIZE — суммарный размер образа.

Основные типы объектов Docker и их влияние на дисковое пространство​


Docker хранит данные в нескольких типах объектов:

  1. Образы (Images)
  2. Контейнеры (Containers)
  3. Тома (Volumes)
  4. Сети (Networks)

Образы (Images)​


Образы — это шаблоны, из которых создаются контейнеры. Каждый образ содержит слои, которые могут быть общими между несколькими образами. Важно понимать, что Docker не удаляет образы автоматически, особенно если они используются другими контейнерами.

Чтобы посмотреть список образов:

Bash:
$ docker images

Чтобы удалить неиспользуемые образы:

Bash:
$ docker image prune

По умолчанию команда удаляет только "dangling" образы — те, у которых нет метки (<none>). Чтобы удалить все неиспользуемые образы:

Bash:
$ docker image prune -a

Для автоматического удаления без подтверждения:

Bash:
$ docker image prune -a -f

Можно фильтровать по времени создания образа:

Bash:
$ docker image prune -a --filter "until=24h"

Контейнеры (Containers)​


Контейнеры — это экземпляры образов. После остановки контейнеры остаются на диске, занимая место. Если контейнер был запущен с флагом --rm, он автоматически удаляется после завершения.

Чтобы посмотреть все контейнеры:

Bash:
$ docker ps -a

Чтобы удалить остановленные контейнеры:

Bash:
$ docker container prune

Фильтрация по времени:

Bash:
$ docker container prune --filter "until=24h"

Тома (Volumes)​


Тома — это области хранения данных, которые не удаляются автоматически даже после удаления контейнера. Они могут быть связаны с контейнерами и сохранять данные.

Чтобы посмотреть тома:

Bash:
$ docker volume ls

Чтобы удалить неиспользуемые тома:

Bash:
$ docker volume prune

Фильтрация по метке:

Bash:
$ docker volume prune --filter "label!=keep"

Сети (Networks)​


Сети в Docker занимают минимальное количество дискового пространства, но создают записи в iptables, сетевые устройства и маршруты. Удаление неиспользуемых сетей:

Bash:
$ docker network prune

Фильтрация по времени:

Bash:
$ docker network prune --filter "until=24h"

Объединённая очистка: docker system prune​


Команда docker system prune — это быстрый способ очистки большинства неиспользуемых объектов:

Bash:
$ docker system prune

По умолчанию удаляет:

  • Все остановленные контейнеры
  • Все неиспользуемые сети
  • Все dangling образы
  • Все неиспользуемый build cache

Для включения удаления томов:

Bash:
$ docker system prune --volumes

Для автоматической очистки без подтверждения:

Bash:
$ docker system prune -f

Фильтрация по времени:

Bash:
$ docker system prune --filter "until=24h"

Проблемы и ограничения при очистке​


При использовании команд prune важно понимать следующее:

  • Тома не удаляются по умолчанию. Если вы хотите удалить тома, необходимо использовать флаг --volumes.
  • Некоторые данные могут быть потеряны, если они связаны с контейнерами, которые не были удалены.
  • Фильтрация по времени — полезная возможность, но не всегда точная. Например, --filter "until=24h" удаляет объекты, созданные более 24 часов назад, но не учитывает, были ли они использованы.

Проверка дискового пространства вне Docker​


Иногда проблема может быть не в Docker, а в общем состоянии дискового пространства. Проверьте свободное место на диске:

Bash:
$ df -h

Если дисковое пространство на диске, где находится Docker, истощено, это может привести к ошибке "no space left on device", даже если Docker сам не использует весь диск.

Безопасная практика при работе с Docker​


  1. Регулярная очистка — настройте автоматическую очистку через cron или systemd.
  2. Мониторинг дискового пространства — используйте мониторинг для отслеживания использования диска.
  3. Использование фильтров — применяйте фильтрацию при очистке, чтобы избежать удаления важных данных.
  4. Резервное копирование — перед массовой очисткой сделайте резервную копию важных данных.

Рекомендации по устранению ошибки "no space left on device"​


  1. Проверьте общее использование диска:

    Bash:
    $ df -h
  2. Проверьте использование Docker:

    Bash:
    $ docker system df
  3. Удалите неиспользуемые объекты:

    Bash:
    $ docker system prune -a --volumes
  4. Проверьте, не переполнен ли журнал:

    Если используется journald, он может потреблять место. Проверьте:

    Bash:
    $ journalctl --disk-usage
  5. Очистите журналы:

    Bash:
    $ journalctl --vacuum-size=100M
  6. Убедитесь, что нет других процессов, потребляющих место:

    Например, логи приложений, временные файлы, кэши.

Альтернативные способы освобождения места​


Если стандартные методы не помогают, можно использовать следующие подходы:

  1. Удаление старых логов контейнеров:

    Логи контейнеров могут занимать значительное место. Их можно управлять через log-driver и log-opt в конфигурации Docker.
  2. Очистка кэшей:

    Очистите кэши Docker, если они не нужны:

    Bash:
    $ docker buildx prune
  3. Использование внешнего хранилища:

    Для больших данных используйте тома, связанные с внешним хранилищем (например, NFS).
  4. Миграция на SSD:

    Если проблема связана с производительностью, переход на SSD может помочь, но не решит проблему с объёмом.

Заключение​


Ошибка "no space left on device" в Docker — это не всегда проблема самого Docker, а может быть следствием накопления неиспользуемых данных. Регулярная очистка, мониторинг и понимание структуры данных Docker позволяют избежать таких ситуаций. Используйте команды prune, df, images, ps, volume ls и другие для диагностики и управления дисковым пространством.

Следуя рекомендациям и применяя безопасные практики, можно эффективно управлять дисковым пространством и избежать ошибок при работе с Docker.

Источники​


 
Назад
Верх Низ