Глиф Учебники

Как освободить место, которое занял Docker

Справочник · Docker · 2 минуты чтения

Сначала посмотрите, что именно занимает место:

Bash
docker system df

Строки — образы (Images), контейнеры (Containers), тома (Local Volumes) и кэш сборки (Build Cache). Столбец RECLAIMABLE — сколько можно освободить. Подробно по каждому объекту — docker system df -v.

Освобождайте по порядку

Идите от безопасного к опасному и после каждого шага проверяйте место (docker system df или df -h). Если образов и томов мало, а папка /var/lib/docker всё равно растёт, — проверьте логи.

  1. Висячие образы и кэш сборки

    Эти команды не трогают работающие контейнеры, нужные образы и данные:

    Bash
    docker image prune
    docker builder prune

    Первая удаляет «висячие» образы — без тега и без контейнеров. Они остаются после обновлений (docker pull) и пересборок. Вторая — неиспользуемый кэш сборки, который особенно разрастается у тех, кто часто собирает свои образы. Обе спрашивают подтверждение.

    Места стало достаточно — на этом можно остановиться.

    Не помогло — дальше: «Остановленные контейнеры и лишние образы»

  2. Остановленные контейнеры и лишние образы

    Bash
    docker container prune
    docker image prune -a
    • container prune удаляет все остановленные контейнеры;
    • image prune -a удаляет все образы, из которых не создано ни одного контейнера. Нужные позже образы просто скачаются заново.

    Или всё вместе (остановленные контейнеры, неиспользуемые сети, образы без контейнеров и кэш сборки):

    Bash
    docker system prune -a

    Перед system prune -a и container prune посмотрите docker ps -a. Остановленный на время сервис считается мусором: его контейнер удалится, а с ним и всё, что лежало в его слое, не в томе.

    Места стало достаточно — тома трогать не нужно.

    Не помогло — дальше: «Тома — осторожно»

  3. Тома — осторожно

    Тома часто занимают больше всего — в них базы данных. Docker никогда не удаляет их сам.

    Bash
    docker volume ls
    docker volume ls --filter dangling=true
    docker volume prune

    Вторая команда показывает тома, к которым не подключён ни один контейнер. docker volume prune удаляет из них только анонимные (со случайными длинными именами).

    docker volume prune -a и docker system prune --volumes удаляют данные навсегда. Том базы, чей проект вы остановили через docker compose down, ни к одному контейнеру не подключён — и будет удалён. Удаляйте тома по одному, по имени, когда точно знаете, что в них: docker volume rm имя.

    Место освободилось — убедитесь по docker volume ls, что тома нужных баз на месте.

Логи

Большие логи — частая причина того, что /var/lib/docker растёт, хотя образов мало. Найти самые крупные:

Bash
sudo sh -c 'du -h /var/lib/docker/containers/*/*-json.log | sort -h | tail -5'

Ограничить их рост для новых контейнеров — параметры max-size и max-file в /etc/docker/daemon.json (урок Обновление и очистка места).

Чего не делать

Не удаляйте файлы и папки в /var/lib/docker вручную (overlay2, containers, volumes). Docker хранит учёт этих файлов, и после ручного удаления образы и контейнеры ломаются, а освободить место правильно становится сложнее.

Если диск заполнен целиком и Docker пишет no space left on device, начните с docker image prune -a и docker builder prune — обычно это быстро возвращает гигабайты. Если места под Docker в принципе мало, его папку данных можно перенести на другой диск параметром data-root в daemon.json — это описано в документации Docker.