Overlay2 переполнен: как очистить 47 ГБ мусора в Docker

    Многие администраторы сталкиваются с ситуацией, когда диск заполняется из-за папки /var/lib/docker/overlay2. В этой статье мы подробно разберём, почему это происходит (на примере контейнера PostgreSQL), как найти проблемный контейнер и, главное, как устранить причину, а не просто удалять файлы.

    Почему overlay2 занимает 47 ГБ?

    Драйвер хранения OverlayFS создаёт слои для каждого контейнера. Когда контейнер активно пишет во временные папки (например, /tmp), эти данные сохраняются в слое diff внутри overlay2. В случае с PostgreSQL в папке /tmp внутри контейнера накопилось более 18 тысяч файлов по 2.6 МБ каждый - итого около 47 ГБ. Это не нормальное поведение, а следствие неправильной конфигурации или ошибки в приложении.

    Как найти контейнер, забивающий диск?

    Используйте команду docker ps -as - она покажет размер каждого контейнера. В нашем примере контейнер postgres весил 42 ГБ (виртуальный 47 ГБ). Затем выполните docker inspect для всех запущенных контейнеров, чтобы найти ID слоя overlay2, который совпадает с проблемной папкой. После этого зайдите внутрь контейнера и проверьте содержимое /tmp - именно там скапливается мусор.

    Как очистить overlay2 без потери данных?

    Простое удаление папки /var/lib/docker/overlay2/.../diff/tmp временно освобождает место, но файлы появляются снова. Правильный подход - очистить временные файлы внутри самого контейнера. Выполните:

    docker exec -it postgres rm -rf /tmp/*

    Эта команда удалит все файлы внутри /tmp контейнера, не затрагивая монтированные тома. После этого диск освободится. Однако, если причина не устранена, файлы вернутся.

    Как предотвратить повторное заполнение overlay2?

    Чтобы проблема не возвращалась, нужно понять, какое приложение или процесс плодит файлы в /tmp. В случае PostgreSQL это может быть расширение pg_stat_statements или кастомные скрипты, которые пишут временные данные. Рекомендуется:

    • Проверить логи контейнера: docker logs postgres
    • Ограничить размер /tmp через tmpfs: добавьте в docker-compose.yml для сервиса tmpfs: /tmp
    • Настроить автоматическую очистку временных файлов (cron внутри контейнера)

    Использование tmpfs для временных файлов

    Самый надёжный способ - монтировать /tmp как tmpfs (в оперативной памяти) в контейнере PostgreSQL. Добавьте в docker-compose.yml:

    db:
    image: postgres
    tmpfs: /tmp
    volumes:
    - postgres_data:/var/lib/postgresql/data

    После перезапуска контейнера все файлы, которые пишутся в /tmp, будут храниться в памяти, а не на диске. Это полностью исключит переполнение overlay2 из-за временных файлов.

    Дополнительные советы по очистке Docker

    Регулярно используйте docker system prune -a для удаления неиспользуемых образов, контейнеров и сетей. Однако помните, что это не решит проблему, если контейнер активно пишет мусор. Всегда проверяйте логи и настройки приложений.

    Если вы используете PostgreSQL в Docker, также настройте параметр temp_file_limit в конфигурации базы данных, чтобы ограничить объём временных файлов на уровне СУБД.

    Часто задаваемые вопросы