Docker: no space left on device при запуске контейнеров
Каталог /var/lib/docker растёт незаметно: образы, остановленные контейнеры, тома, кеш сборки. При заполнении раздела перестают запускаться контейнеры, а иногда и сам демон.
Вероятные причины
По порядку: сверху то, что встречается чаще.
-
Накопились неиспользуемые образы и остановленные контейнеры
Docker ничего не удаляет сам. При частых сборках и обновлениях старые слои остаются на диске.
-
Раздел с /var/lib/docker слишком мал
На машинах с отдельным небольшим корнем каталог Docker заполняет его целиком.
-
Журналы контейнеров не ограничены
По умолчанию журналы контейнеров растут без предела. Один болтливый контейнер может занять десятки гигабайт.
Диагностика
Команды идут в том порядке, в котором их стоит выполнять: каждая следующая проверяет то, что осталось после предыдущей.
Распределение занятого места по образам, контейнерам, томам и кешу сборки.
docker system dfСвободное место на разделе.
df -h /var/lib/dockerЧто именно занимает место.
sudo du -sh /var/lib/docker/* | sort -h | tailРешение
Решение своё для каждой причины. Сначала определите, какая из них ваша, — иначе правки наложатся друг на друга.
- Почему происходит
- Docker ничего не удаляет сам. При частых сборках и обновлениях старые слои остаются на диске.
- Как проверить
-
Посмотрите занятое место по видам объектов.
docker system df df -h /var/lib/docker
- Как исправить
-
Удалите неиспользуемое. Команда с флагом тома удаляет и данные — применяйте осознанно.
docker system prune -a # только при уверенности: docker system prune -a --volumes
- Почему происходит
- На машинах с отдельным небольшим корнем каталог Docker заполняет его целиком.
- Как проверить
-
Посмотрите размер раздела и занятое место.
df -h /var/lib/docker sudo du -sh /var/lib/docker/* 2>/dev/null | sort -h | tail -5
- Как исправить
-
Перенесите каталог данных на отдельный раздел через параметр
data-rootв daemon.json, остановив демон перед переносом.
- Почему происходит
- По умолчанию журналы контейнеров растут без предела. Один болтливый контейнер может занять десятки гигабайт.
- Как проверить
-
Найдите самые крупные файлы журналов контейнеров.
sudo du -sh /var/lib/docker/containers/*/*-json.log 2>/dev/null | sort -h | tail -5
- Как исправить
-
Ограничьте размер журналов в daemon.json параметрами драйвера журналирования и перезапустите демон.
# /etc/docker/daemon.json # {"log-driver":"json-file","log-opts":{"max-size":"50m","max-file":"3"}}
Пример вывода
Раздел заполнен слоями образов. Пример показательный: он собран на тестовой машине специально для этой страницы, а не взят из чужого журнала.
dockerd[1200]: error creating overlay mount to /var/lib/docker/overlay2/.../merged: no space left on device
containerd[1100]: failed to create shim task: OCI runtime create failed: write /sys/fs/cgroup/...: no space left on device
Связанные ошибки
- No space left on device в журнале службы Нет места на устройстве: разбор по свободным блокам, по inode, по журналу systemd и по удалённым, но открытым файлам.
- status=219/CGROUP в systemd Код 219/CGROUP: не удалось создать или настроить контрольную группу службы. Причины на уровне системы и контейнеров.
- Docker: unable to configure the Docker daemon with file daemon.json Демон Docker не запускается из-за ошибки в /etc/docker/daemon.json: неверный JSON или неизвестный ключ.
- A start job is running: загрузка висит на одной службе Загрузка останавливается с обратным отсчётом: служба не укладывается в таймаут. Как найти виновника и не ждать.
- Address already in use при запуске службы Порт или адрес уже занят: bind() failed (98: Address already in use). Как найти владельца порта и что делать с остатками прежнего процесса.
- Apache: Invalid command — не включён модуль Apache не запускается: директива требует модуль, который не подключён. Как найти нужный модуль и включить.
- Cannot assign requested address при привязке Ошибка 99 при привязке: адрес не принадлежит машине или ещё не поднят. Разбор с network-online.target и ip_nonlocal_bind.
- Connection refused в журнале службы Соединение отклонено: служба не может подключиться к базе, кешу или другому сервису. Порядок запуска, адрес, брандмауэр.
Где встречается чаще всего
Источники
- Документация Docker: очистка неиспользуемых объектов
-
Воспроизведено на тестовой машине, systemd 255 (Ubuntu 24.04)
Воспроизведено заполнением раздела слоями образов на тестовой машине.