Со временем Docker накапливает старые образы, остановленные контейнеры, кэш сборки и логи. На небольшом диске это заканчивается ошибкой no space left on device. Разберёмся, что можно удалять, а что — нет.
Что занимает место
$ df -h /$ docker system df$ du -sh /var/lib/dockerdocker system df показывает объём образов, контейнеров, томов и кэша сборки, а в колонке RECLAIMABLE — сколько можно освободить.
Безопасная уборка
$ docker container prune -f$ docker image prune -f$ docker builder prune -fЧтобы удалить все образы, которые не используются ни одним контейнером (в том числе с тегами):
$ docker image prune -a -fЛоги контейнеров
По умолчанию драйвер json-file пишет логи без ограничения размера. Найти самые большие:
$ du -h /var/lib/docker/containers/*/*-json.log | sort -h | tail -5Задайте лимит для всех новых контейнеров в /etc/docker/daemon.json:
{ "log-driver": "json-file", "log-opts": { "max-size": "20m", "max-file": "3" }}$ systemctl restart dockerЕсли диск уже заполнен и место нужно немедленно, лог можно обнулить, не останавливая контейнер (подставьте полный id контейнера):
$ truncate -s 0 /var/lib/docker/containers/<id>/<id>-json.logПроверьте результат
$ docker system df$ docker inspect --format "{{.HostConfig.LogConfig}}" имя-контейнераУ пересозданных контейнеров в LogConfig должны появиться max-size и max-file.
Частые ошибки
- Ошибка в daemon.json (например, лишняя запятая) — Docker не запустится. Смотрите journalctl -u docker после перезапуска.
- Удаление файлов в /var/lib/docker вручную ломает состояние Docker. Пользуйтесь командами prune.
- Место не освободилось после rm лога — файл всё ещё открыт процессом. Используйте truncate.