Если вы ежедневно работаете с Docker, то знаете, насколько быстро он может потреблять дисковое пространство.
Со временем ваша система накапливает неиспользуемые образы, контейнеры, тома и сети. Они в основном простаивают, занимая ценное хранилище и, возможно, мешая вам работать над текущим проектом. К счастью, Docker предоставляет встроенные команды очистки, которые легко удаляют ненужные ресурсы.
Эти команды очистки являются частью семейства docker prune
, и сегодня вы узнаете о них все. Они быстро станут вашим основным решением для освобождения дискового пространства.
Давайте начнем с краткого обзора, прежде чем перейти к практическим примерам.
Вы новичок в Docker? Ознакомьтесь с нашим руководством по изучению Docker с нуля для специалистов по данным, чтобы быстро войти в курс дела.
Что такое Docker Prune?
Термин “Docker Prune” обычно относится к набору команд, предназначенных для помощи в удалении неиспользуемых и ненужных ресурсов Docker.
Со временем, особенно если вы работаете над несколькими проектами, вы создадите бесчисленное количество образов, запустите контейнеры и настроите тома и сети. Все это накапливается в вашей системе, занимая значительное количество дискового пространства. Цель docker prune
— очистить этот беспорядок и вернуть место на диске.
Тем не менее, в docker prune
больше, чем кажется на первый взгляд.
Это не просто одна команда, которую вы можете выполнить. Ну, вы могли бы, но иногда вам нужен гранулярный контроль над тем, что удаляется. Вот здесь и пригодится эта статья. Она покажет вам, как эффективно управлять очисткой, гарантируя, что вы удаляете только то, что намерены, и как практиковаться в безопасной среде, чтобы избежать случайного удаления важных данных.
Также стоит отметить, что команды обрезки удаляют только ресурсы, которые не используются активно. Образы, тома и сети, на которые ссылаются запущенные контейнеры, не будут удалены. Другими словами, обрезка не повлияет на активные рабочие нагрузки.
В следующем разделе мы расскажем вам о различных типах команд обрезки и объясним, как они вписываются в ваш рабочий процесс.
Хотите добавить Docker в свое резюме или портфолио? Эти 10 идей проектов Docker сделают вас готовыми к работе.
Все команды обрезки Docker с практическими примерами
Докер предоставляет несколько команд prune
, которые позволяют вам очищать неиспользуемые ресурсы индивидуально или все сразу. В этом разделе вы узнаете о них – как через теорию, так и через практические примеры.
docker system prune
Это наиболее полная команда для освобождения дискового пространства. Она удаляет все неиспользуемые контейнеры, сети, образы и кэш сборки одной операцией.
Если вам нужен быстрый способ освободить место на диске одной командой, вот что нужно использовать.
Вы можете передать параметры команде docker system prune
:
-a
или--all
удаляет все неиспользуемые образы, а не только зависимые (образы, которые не имеют тегов или на которые нет ссылок из контейнера).--filter
позволяет указать значения фильтра.-f
или--force
пропускает запрос подтверждения.--volumes
также удаляет анонимные тома вместе с контейнерами, сетями, образами и кэшем сборки.
По умолчанию, docker system prune
запрашивает подтверждение, так как это потенциально разрушительная операция:
Изображение 1 – Запрос подтверждения для очистки системы Docker
Чтобы обойти запрос и удалить все неиспользуемые образы, контейнеры, сети и тома одной командой, выполните:
docker system prune -a -f --volumes
Изображение 2 – Удалите все с помощью одной команды системного очистки docker
Но что, если вам нужен более детальный контроль? Давайте рассмотрим это далее.
docker container prune
Просто говоря, эта команда удаляет все остановленные контейнеры.
Остановленные контейнеры остаются в вашей системе до тех пор, пока не будут удалены вручную. Они могут занимать место на диске и их трудно заметить, если вы не используете инструмент, такой как Docker Desktop Dashboard.
Как docker system prune
, эта команда поддерживает параметры:
--filter
позволяет вам указывать пары ключ-значение для управления тем, какие контейнеры будут удалены.-f
или--force
пропускает запрос на подтверждение.
Вот список неработающих контейнеров:
Изображение 3 – Список неработающих контейнеров
Чтобы удалить code-server
(и любой другой остановленный контейнер), выполните команду:
docker container prune -f
Это не попросит вас подтвердить, и в течение нескольких секунд вы увидите сообщение вроде этого:
Изображение 4 – Сообщение вывода об очистке контейнеров
И вот, больше нет остановленных контейнеров:
Изображение 5 – Список неработающих контейнеров (2)
Теперь давайте позаботимся об неиспользуемых образах.
docker image prune
Подобно предыдущей команде, docker image prune
удаляет неиспользуемые образы.
По умолчанию он удаляет только подвисшие образы – образы, которые не имеют тега и не связаны с контейнером. Вы можете использовать необязательный флаг, чтобы удалить все неиспользуемые образы, а не только подвисшие.
Вот список доступных опций
-a
или--all
удаляет все неиспользуемые образы, а не только подвисшие.--filter
позволяет указать пары ключ-значение для управления удалением изображений.-f
или--force
пропускает запрос на подтверждение.
Теперь давайте посмотрим, как это работает!
Вот список изображений, находящихся в системе:
Изображение 6 – Список образов Docker
Чтобы удалить их всех одной командой, выполните:
docker image prune -a -f
Вы увидите такой вывод в терминале:
Изображение 7 – Сообщение об обрезке изображения
После этого в Docker Desktop не останется изображений:
Изображение 8 – Список изображений Docker (2)
Далее давайте обработаем неиспользуемые тома.
docker volume prune
Как следует из названия, команда docker volume prune
удаляет все неиспользуемые локальные тома. Другими словами, она удаляет тома, на которые не ссылается ни один контейнер.
По умолчанию команда удаляет только анонимные тома – безымянные тома, созданные Docker при запуске контейнера. Чтобы удалить явно именованные тома, вам нужно передать дополнительную опцию.
Вот доступные вам опции:
-a
или--all
удаляет все неиспользуемые тома вместо только анонимных.--filter
позволяет указать пары ключ-значение для контроля над томами, которые будут удалены.-f
или--force
пропускает запрос на подтверждение.
На нашей системе есть один пользовательский том из файла docker-compose.yml
:
Изображение 9 – Список томов Docker
Следующая команда удаляет все локальные тома:
docker volume prune -a -f
После ее выполнения вы увидите вывод, аналогичный следующему:
Изображение 10 – Сообщение об удалении объемов
Теперь объемы не остались:
Изображение 11 – Список объемов Docker (2)
Наконец, давайте посмотрим, как удалить неиспользуемые сети.
docker network prune
Когда контейнеры Docker общаются друг с другом, они часто используют сети, определенные пользователем. Однако их сети обычно остаются в вашей системе после удаления этих контейнеров.
Команда docker network prune
удаляет сети, которые больше не используются ни одним контейнером.
Как и другие команды prune, она включает в себя несколько опций:
--filter
позволяет вам указать пары ключ-значение, чтобы контролировать, какие сети будут удалены.-f
или--force
пропускает запрос на подтверждение.
В отличие от изображений, контейнеров или томов, вы не можете визуально просматривать сети через Docker Desktop, поэтому вам нужно будет работать из командной строки. Вот список доступных сетей:
Изображение 12 – Список сетей Docker
Чтобы удалить все сети, не связанные с установкой Docker по умолчанию, выполните:
docker network prune -a -f
После выполнения команды вы увидите вывод, подобный этому:
Изображение 13 – Сообщение о выводе очистки сетей
Все сети, связанные с ранее запущенными контейнерами, теперь удалены:
Изображение 14 – Список сетей Docker
Однако следует отметить, что три оставшиеся сети необходимы для правильной работы Docker и не могут быть удалены.
И вот и все базовые применения команды docker prune
! Далее мы рассмотрим более сложные темы, такие как безопасное использование этих команд и лучшие практики для производственных и чувствительных сред.
Безопасное использование Docker Prune
Команды docker prune
помогают быстро освободить дисковое пространство, но их следует использовать осторожно, особенно в производственных средах.
При случайном удалении важных контейнеров, образов или томов может произойти потеря данных и нарушение критических рабочих процессов. Чтобы этого избежать, лучше понять, что будет удалено, прежде чем выполнить любую команду очистки.
В этом разделе объясняются основные меры предосторожности при безопасном выполнении команды docker prune
.
Понимание того, что будет удалено
Команды prune
предназначены для удаления только тех ресурсов, которые не используются в данный момент.
Например, docker image prune
удаляет только висячие образы, а docker volume prune
удаляет только тома, не привязанные к контейнерам. Однако добавление опций, таких как -a -f
, удалит все образы или тома без запроса подтверждения.
Кроме того, в сложных средах зависимости могут быть легко упущены, поэтому всегда полезно дважды проверить перед очисткой.
Перед запуском любой команды prune
вы должны проверить вашу систему, чтобы увидеть, какие ресурсы в данный момент используются. Существует несколько способов сделать это, и мы рассмотрим наиболее распространенные из них в этом разделе.
Используйте эту команду для просмотра всех контейнеров, включая остановленные:
docker ps -a
Вы должны увидеть вывод, аналогичный следующему:
Изображение 15 – Список всех контейнеров Docker
Аналогично, используйте эту команду для перечисления всех образов, включая неиспользуемые:
docker images
Вывод будет структурирован аналогично предыдущему:
Изображение 16 – Список всех образов Docker
Для проверки объемов выполните эту команду, чтобы перечислить все объемы:
docker volume ls
Изображение 17 – Список всех объемов Docker
Внимательно изучите эти выводы, чтобы убедиться, что по ошибке не будут удалены критические ресурсы.
Пробный запуск для безопасности
К сожалению, в Docker до сих пор нет встроенной опции для пробного запуска команды очистки, хотя она была запрошена много лет назад.
Из-за этого вам необходимо вручную проверить ресурсы с использованием команд, перечисленных в предыдущем разделе, перед выполнением команды очистки.
Если вы работаете в чувствительной среде, где критична сохранность данных, вам всегда следует создать резервную копию перед выполнением команд очистки, которые затрагивают тома.
Конечно, это всего лишь меры предосторожности, но мы надеемся, что скоро будет реализована опция пробного выполнения.
Лучшие практики для очистки Docker
Чтобы держать ваше рабочее окружение Docker свободным от ненужного мусора, важно регулярно запускать команды prune
— возможно, даже автоматизировать их.
Этот раздел расскажет вам о лучших практиках запуска команд docker prune
в производственных средах.
Регулярно используйте docker prune
Со временем Docker накапливает неиспользуемые образы, остановленные контейнеры и ненужные тома — все это требует значительного дискового пространства.
Запуск команд очистки регулярно помогает поддерживать порядок в вашей среде и предотвращает избыточное использование диска. Вы должны включить их в рамки вашегографика обслуживания.
Пару недель – это хорошая отправная точка, но если ваша настройка включает частое создание и удаление контейнеров, рассмотрите более частый график.
Будьте осторожны в производстве
Любая работа в производственной среде требует дополнительной осторожности, и очистка Docker не является исключением.
Момент невнимательности может привести к простою или потере данных, и вы не хотите быть ответственным за это. Перед запуском команд docker prune
в производственной среде всегда проверяйте ресурсы системы с помощью docker ps -a
, docker images
и docker volume ls
, как объяснялось в предыдущем разделе.
Кроме того, рекомендуется использовать конкретные команды очистки вместо всеобъемлющей docker system prune
, так как это может быть проще восстановить после непреднамеренного удаления.
Автоматизация очистки docker
Еще одной хорошей практикой является оптимизация усилий по очистке путем автоматизации команд docker prune
с использованием запланированных задач.
На Linux можно настроить задание cron для запуска команд с определенной периодичностью, а на Windows можно использовать Планировщик задач для подобной автоматизации. Это помогает поддерживать систему в порядке без необходимости ручного вмешательства. Однако в производственной среде убедитесь, что автоматическая очистка не мешает критическим рабочим нагрузкам.
Например, это задание cron на Linux запускает полную команду очистки каждое воскресенье в полночь:
0 0 * * 0 docker system prune -a -f
Устранение проблем с очисткой Docker
Команды docker prune
– это стандартное решение для восстановления дискового пространства, но иногда этого может быть недостаточно для обеспечения достаточного места для загрузки новых образов или запуска новых контейнеров.
Кроме того, можно случайно удалить важные ресурсы, поэтому важно обсудить стратегии восстановления.
Оба эти вопроса будут рассмотрены в данном разделе.
Возникновение проблем с дисковым пространством
Образы Docker могут быть крупными – у нас недавно был образ размером более 13 ГБ – и уверены, что где-то есть еще более крупные. Поэтому даже после выполнения docker prune
вы можете обнаружить, что на вашей системе по-прежнему не хватает дискового пространства.
Чтобы узнать точно, сколько места используется изображениями, контейнерами и томами, выполните эту команду:
docker system df
Изображение 18 – Место, используемое Docker
При восстановлении дискового пространства с помощью команд docker prune
добавьте флаг -a
, чтобы удалить все изображения, тома или контейнеры, а не только висячие или анонимные. Конечно, помните о потенциальных недостатках такого подхода.
Если проблема с дисковым пространством сохраняется, единственным вариантом является увеличение доступного дискового пространства.
Восстановление после случайных удалений
Восстановление проще сказать, чем сделать — именно поэтому мы рекомендуем понять, что будет удалено при обрезке, прежде чем выполнять саму команду.
Тем не менее, если вы оказались в ситуации, когда случайно удалили важные контейнеры, образы или тома,начните с проверки журналов, чтобы определить, что было удалено.
На macOS это можно сделать, запустив следующие две команды (опции для Windows и Linux):
pred='process matches ".*(ocker|vpnkit).*" || (process in {"taskgated-helper", "launchservicesd", "kernel"} && eventMessage contains[c] "docker")' /usr/bin/log stream --style syslog --level=debug --color=always --predicate "$pred" /usr/bin/log show --debug --info --style syslog --last 30m --predicate "$pred" >/tmp/logs.txt
Запуск этих команд позволит сохранить последние 30 минут журналов, связанных с Docker, в файл /tmp/logs.txt
. Вы должны проверить эти журналы, чтобы определить, какие контейнеры или образы были удалены.
Для удаленных образов, вероятно, вы можете снова загрузить их из реестра, такого как Docker Hub. Команда вроде этой должна помочь:
docker pull <image_name>
И для удаленных контейнеров, вы всегда можете воссоздать их, если они были основаны на постоянных образах:
docker run --name <container_name> <image_name>
В противном случае, вы можете восстановить из резервных копий, если они доступны, что можно использовать для восстановления как объемных, так и данных контейнера. В будущем рассмотрите использование инструментов для снимков томов, чтобы предотвратить потерю данных.
Однако лучшая стратегия – проверить ресурсы, которые будут удалены перед запуском команды очистки, и продолжать только в том случае, если вы абсолютно уверены, что это не повлияет на ваш рабочий процесс.
Подводя итоги Docker Prune
В заключение, семейство команд docker prune
– это мощный способ восстановления дискового пространства, но с риском случайного удаления ваших ресурсов, что может привести к потере данных. Этот риск еще больше при использовании необязательных флагов -a -f
, которые удалят все принудительно.
Тем не менее, очистка остается основным методом для поддержания системы в порядке и организованности.
Вам нужно быть осторожным, особенно в производственных средах. Используйте команды, такие как docker ps -a
, docker images
и docker volume ls
, прежде чем приступать к очистке, чтобы перечислить все контейнеры, образы и тома. Запускайте команду очистки только после того, как убедитесь, что вы уверены в удалении перечисленных ресурсов (предполагая, что они не используются запущенным контейнером).
Если вы хотите узнать больше о Docker, контейнеризации и контейнерной оркестрации, ознакомьтесь с этими курсами на DataCamp: