Docker — один из наиболее востребованных инструментов в сфере разработки и DevOps. Однако порой образуется множество не нужных более образов, а также контейнеров и томов. Их переизбыток может приводить к замедлению работы приложений и загромождению диска, поэтому периодически нужно избавляться от этого мусора.
И надо сказать, что в Докере есть достаточно возможностей, чтобы периодически чистить систему, причем делать это можно непосредственно из командной строки. И когда вы запомните приведенные ниже команды, процесс очистки будет ненамного сложнее, чем использование «корзины» в ОС. И не забудьте заглянуть в «Заключение», которое обычно читают редко, но в данном случае мы решили включить туда полезное предостережение.
Сначала приведем команду, которая удаляет всё, включая и так называемые «висячие» объекты:
docker system prune
А для удаления остановленных объектов потребуется флаг -a
, вот так:
docker system prune -a
Не используемые более образы уничтожаются так:
docker image prune -a
Эта команда включает также дочерние образы и метаданные.
Теперь избавляемся от всех контейнеров:
docker container prune
И, наконец, убираем тома:
docker volume prune
Чтобы убедиться, что вы удаляете правильные объекты, задействуйте флаги --dry-run
или -n
для просмотра объектов без их фактического уничтожения. Кроме того, эти команды удаляют объекты без возможности восстановления. Поэтому перед выполнением приведенных выше (и ниже) инструкций удостоверьтесь, что вы понимаете, какие объекты будут удалены, и вы не удаляете что-то важное.
Здесь рассмотрим основные инструкции по удалению определенного количества образов с заданными параметрами или без них.
Для этого сначала вводим:
docker images -a
Команда позволяет отобразить список всех Docker-образов, которые находятся на локальной машине, включая не используемые в данный момент. Флаг -a
указывает Docker на отображение всех имеющихся образов, а не только тех, которые были недавно созданы.
Далее вводим:
docker rmi Img Img
Вместо Img
подставьте название для удаления. Несколько названий следует указывать через пробел.
Чтобы получить перечень неиспользуемых образов (такие объекты также называются «висячими»), вводим:
docker images -f dangling=true
Такие образы могут возникать при создании новых на основе старых с тем же именем, но без тега. В этом случае старый образ становится висячим и не используется. -f
фильтрует объекты по различным критериям, в данном случае мы выполняем фильтрацию, задав dangling=true
.
Теперь для удаления неиспользуемых образов вводим:
docker image prune
Эта инструкция затрагивает висячие образы и те, которые более не используются. При выполнении этой инструкции образы будут удалены без возможности восстановления.
Для поиска образов, содержащих некоторый шаблон в их именах, введите:
docker images -a | grep "pattern"
-a
отображает все образы, в том числе неактивные и промежуточные. grep
фильтрует вывод, чтобы отобразить только те образы, в именах которых содержится указанный шаблон (соответственно, введите его вместо "pattern"
, сохранив кавычки).
А чтобы избавиться от них, введите:
docker images -a | grep "pattern" | awk '{print $3}' | xargs docker rmi
awk '{print $3}'
отображает только третий столбец вывода, содержащий идентификаторы. xargs docker rmi
нужен, чтобы передать идентификаторов в docker rmi
, удаляющей данные образы. xargs
разбивает список идентификаторов образов на отдельные аргументы. Если вы пытаетесь удалить несколько образов, перечисляя их идентификаторы вручную, вы можете столкнуться с проблемой, если идентификаторы содержат пробелы или другие специальные символы. В этом случае использование xargs
более безопасно и удобно.
Для удаления используемых образов введите:
docker rm -f $(docker ps -a -q)
Это остановит и уничтожит контейнеры перед удалением образов.
Для отображения списка всех образов, которые находятся на локальной машине, включая не используемые в данный момент, вводим:
docker images -a
Далее для удаления всех неактивных образов на локальной машине вводим:
docker rmi $(docker images -a -q)
Эта команда выводит список идентификаторов всех образов на локальной машине и передает его в качестве аргумента docker rmi
, которая удаляет все Docker-образы без возможности восстановления. А чтобы удалить и активные, используемые контейнерами, вводим:
docker rm -f $(docker ps -a -q)
В этой части рассмотрим все основные инструкции по удалению определенного количества контейнеров с заданными параметрами или без них.
Для начала вводим:
docker ps -a
Теперь вводим инструкцию для удаления:
docker rm Name_or_ID
Для ее корректного использования замените Name_or_ID
соответствующим количеством ID или имен (несколько объектов следует указывать через пробел).
Также для удаления контейнера он должен быть остановлен. Если контейнер запущен, то сначала вводим:
docker stop Name_or_ID
А для уничтожения всех объектов этого типа на локальной машине введите:
docker rm $(docker ps -a -q)
Для запуска нового контейнера на основе указанного образа введите, заменив имя на нужное:
docker run --rm image_name
Флаг --rm
указывает Docker на удаление после остановки.
Теперь небольшое пояснение. По умолчанию созданный контейнер остается на локальной машине после остановки. И если вы не хотите сохранять контейнер, то задействуйте флаг --rm
. Это очень удобно при запуске временных контейнеров для выполнения какой-то задачи, например, запуска тестов, когда вы не хотите оставлять за собой «мусор». А для сохранения данных помогут такие флаги, как -v
для монтирования томов или -e
для передачи переменных среды.
Сначала вводим:
docker ps -a -f status=exited
Флаг -f status=exited
здесь фильтрует вывод.
Теперь для удаления вводим:
docker rm $(docker ps -a -f status=exited -q)
Чтобы вывести контейнеры со статусами exited
(остановлены) и created
(созданы), то есть не запущенные и не работающие в данный момент, введите:
docker ps -a -f status=exited -f status=created
Флаги -a
и -f
здесь указывают Docker на отображение всех контейнеров и их фильтрацию.
Теперь для удаления всех объектов, которые находятся в состояниях exited
или created
, введите:
docker rm $(docker ps -a -f status=exited -f status=created -q)
Для получения перечня контейнеров на локальной машине, а затем фильтрации списка, чтобы отобразить только те объекты, в именах которых есть определенный шаблон, введите, заменив "pattern"
на нужный шаблон, сохраняя кавычки:
docker ps -a | grep "pattern"
Теперь для удаления объектов, в именах которых есть строка "pattern"
, вводим:
docker ps -a | grep "pattern" | awk '{print $1}' | xargs docker rm
Эта инструкция использует grep
для фильтрации списка, awk '{print $1}'
для извлечения первого столбца (идентификатора), а затем передает идентификаторы, используя xargs
. Добавим, что docker ps -a | grep "pattern"
может выводить не только имена, но и другую информацию: статус, ID и т.д. Поэтому для удаления объектов, в указанных параметрах которых есть строка "pattern"
, задействуйте инструкцию выше.
Для получения перечня контейнеров на локальной машине, включая не запущенные в данный момент, вводим знакомую инструкцию:
docker ps -a
Она покажет информацию о каждом объекте: идентификатор, имя, статус, задействованные ресурсы и т.д.
Для остановки всех контейнеров на локальной машине вводим:
docker stop $(docker ps -a -q)
И теперь удаляем их, вот так:
docker rm $(docker ps -a -q)
В завершающей главе рассмотрим основные инструкции по удалению определенного количества томов с заданными параметрами или без них.
Для получения перечня томов на локальной машине введите:
docker volume ls
Команда выводит список имеющихся томов, включая информацию о них (ID, имена).
Для удаления определенного числа томов с заданными именами введите, добавив имя нужного тома вместо vlm_name
:
docker volume rm vlm_name
Эта команда принимает разное количество аргументов. Для удаления нескольких объектов перечислите их названия через пробел:
docker volume rm my_volume1 my_volume2
Если тома используются контейнерами, находящимися в работающем состоянии, их нельзя удалить, пока эти контейнеры не будут остановлены или удалены. Попытки уничтожить такие объекты будут сопровождаться выводом ошибки.
Для получения перечня висячих томов на локальной машине введите:
docker volume ls -f dangling=true
Инструкция выводит их перечень, включая их ID и имена. Теперь можно избавиться от них, введя:
docker volume prune
Удалению подвергнутся все объекты данного типа, не ассоциированные ни с одним контейнером и не использующиеся на текущий момент.
Чтобы удалить тома, которые были созданы автоматически, вводим:
docker rm -v container_name
Флаг -v
здесь указывает Docker на необходимость удаления всех связанных томов. Дело в том, что такие тома сохраняются на локальной машине, если не будут удалены явно. Поэтому такая операция может быть полезна для освобождения занимаемого не используемыми томами места на локальной машине.
В завершение отметим, что перед тем, как выполнять инструкции по удалению образов, контейнеров и томов, нужно убедиться, что удаляемые объекты больше не потребуются вам или членам вашей команды. Ведь все эти операции — необратимые. А на этом всё, желаем успехов в работе с Docker!