Введение / Зачем это нужно
Docker — отличный инструмент, но со временем он может накопить значительное количество "мусорных" данных: остановленные контейнеры, старые и дублирующие образы (dangling images), неиспользуемые сети и тома. Эти артефакты могут занимать от сотен мегабайт до нескольких гигабайт дискового пространства. Регулярная очистка Docker — важная практика для поддержания здоровья системы, особенно на серверах с ограниченным дисковым пространством или в CI/CD-окружениях. Этот гайд покажет вам, как безопасно и эффективно выполнить очистку на любой Linux-системе.
Требования / Подготовка
Перед началом убедитесь в следующем:
- На вашей системе установлен и запущен Docker Engine (демон
dockerd). - Ваш пользователь имеет права на выполнение команд Docker (обычно через группу
docker). Для многих команд очистки, особенно полной, потребуются права sudo. - Вы понимаете, что удаление образов и томов — необратимое действие. Убедитесь, что в удаляемых томах нет важных данных (например, баз данных).
- Рекомендуется сначала выполнить создание бэкапов критически важных данных или состояние контейнеров (через
docker commit), если это необходимо.
Пошаговая инструкция
Шаг 1: Проверьте текущее использование диска Docker
Сначала давайте посмотрим, что именно занимает место. Команда docker system df покажет сводку по типам ресурсов.
docker system df
Вывод будет примерно таким:
TYPE TOTAL ACTIVE SIZE RECLAIMABLE
Images 15 3 4.2GB 2.1GB (49%)
Containers 8 2 120MB 80MB (66%)
Local Volumes 12 5 3.5GB 1.8GB (51%)
Build Cache 0 0 0B 0B
Обратите внимание на столбец RECLAIMABLE — это примерный объём, который можно освободить после очистки.
Шаг 2: Удалите остановленные контейнеры
Остановленные контейнеры (Exited или Created) потребляют немного места, но их может быть много. Удалить все остановленные контейнеры можно командой:
docker container prune
По умолчанию команда запросит подтверждение. Чтобы пропустить запрос, добавьте флаг -f или --force:
docker container prune -f
Что делает команда: удаляет все контейнеры в состоянии created или exited. Работающие (running) контейнеры не затронуты.
Шаг 3: Удалите неиспользуемые образы
Это самый важный шаг для освобождения места. Здесь есть два основных варианта:
3.1 Удалить только "висячие" (dangling) образы Dangling images — это образы, у которых нет ни одного тега и которые не являются родительскими для других образов. Обычно они появляются после сборки новых версий или при обновлениях.
docker image prune
Эта команда удалит только dangling images. С флагом -a или --all она удалит все образы, не используемые ни одним контейнером (включая те, у которых есть теги).
3.2 Удалить ВСЕ неиспользуемые образы (включая с тегами) Это более агрессивная и эффективная команда. Она удалит все образы, на которые нет ссылок из существующих (даже остановленных) контейнеров.
docker image prune -a
Важно: Если у вас есть контейнеры, созданные из определённых образов (даже остановленные), эти образы не будут удалены. Чтобы удалить и их, нужно сначала удалить сами контейнеры (см. Шаг 2).
Вы можете добавить фильтр по времени, например, удалить образы, не использованные последние 24 часа:
docker image prune -a --filter "until=24h"
Шаг 4: Удалите неиспользуемые сети и тома
4.1 Очистка сетей
Пользовательские сети (не bridge, host, none) могут оставаться после удаления контейнеров.
docker network prune
Эта команда удалит все сети, не используемые хотя бы одним контейнером.
4.2 Очистка томов (Volumes) Тома (volumes) — это самый "тяжёлый" по объёму ресурс, особенно если в них хранились данные БД. Удалите только неиспользуемые тома:
docker volume prune
Критически важно: Эта команда безвозвратно удалит все данные в томах, которые не подключены к существующим контейнерам. Перед выполнением дважды проверьте, что вам не нужны данные из этих томов. Вы можете сначала посмотреть список всех томов и их размер:
docker volume ls -q | xargs docker volume inspect --format '{{.Name}} {{.Mountpoint}} {{.UsageData.Size}}' | sort -k3 -h
Или более простой вариант:
docker system df -v
В выводе будет блок VOLUME NAME с указанием размера.
Шаг 5: Выполните полную очистку (опционально)
Если вы хотите выполнить всё вышеперечисленное за одну команду, используйте docker system prune. Это "швейцарский нож" для очистки.
Базовая полная очистка:
docker system prune
Эта команда удалит:
- Все остановленные контейнеры.
- Все сети, не используемые хотя бы одним контейнером.
- Все dangling образы.
- Кэш сборки (build cache).
Максимально агрессивная очистка (с флагом -a):
docker system prune -a
Эта команда удалит всё, что не используется:
- Все остановленные контейнеры.
- Все сети, не используемые.
- Все образы, не имеющие связанных контейнеров (даже с тегами!).
- Кэш сборки.
С подтверждением:
По умолчанию команда prune запросит подтверждение. Чтобы выполнить без вопросов, добавьте --force или -f:
docker system prune -a -f
Предупреждение: Команда -a может удалить образы, которые вы планировали использовать позже. Убедитесь, что у вас есть Dockerfile или способ быстро пересобрать нужные образы.
Проверка результата
После завершения очистки снова выполните команду из Шага 1:
docker system df
Сравните значения в столбце SIZE и особенно RECLAIMABLE. Значение RECLAIMABLE должно стремиться к нулю, а общий размер (SIZE) — значительно уменьшиться. Вы также можете проверить свободное место на диске командой df -h.
Возможные проблемы
Проблема 1: Ошибка "Error: No such image" или "conflict: unable to delete..."
- Причина: Попытка удалить образ, который является родительским для другого образа или используется (даже остановленным) контейнером.
- Решение: Сначала удалите все контейнеры, основанные на этом образе (
docker ps -aдля поиска,docker rmдля удаления). Если образ "застрял" как родительский, часто помогает принудительное удаление с-fили полная очистка черезdocker system prune -a.
Проблема 2: Ошибка доступа (permission denied)
- Причина: Запуск команды без прав sudo.
- Решение: Добавьте
sudoперед командой (например,sudo docker system prune -a) или убедитесь, что ваш пользователь в группеdocker(groups $USER), и перезайдите в систему.
Проблема 3: Тома не удаляются, хотя контейнеры удалены
- Причина: Тома, созданные с флагом
--nameили черезdocker volume create, не удаляются автоматически при удалении контейнера. - Решение: Проверьте список всех томов (
docker volume ls). Тома, которые не используются (<none>в колонкеCONTAINER), можно удалить вручную (docker volume rm <volume_name>) или черезdocker volume prune.
Проблема 4: Недостаточно места для выполнения операций
- Причина: Диск заполнен на 100%, и Docker не может создать временные файлы для операций.
- Решение: Временно очистите другие файлы (например, кэш пакетного менеджера:
sudo apt cleanдля Ubuntu/Debian,sudo yum clean allдля CentOS/RHEL) или удалите вручную старые логи (/var/lib/docker/containers/*/*.log).