Удаление образов, контейнеров и томов Docker

  • Михаил
  • 18 мин. на прочтение
  • 164
  • 19 Jul 2023
  • 19 Jul 2023

Docker позволяет легко помещать приложения и службы в контейнеры, чтобы их можно было запускать где угодно. Однако при работе с Docker можно легко накопить чрезмерное количество неиспользуемых образов, контейнеров и томов данных, замедляющих работу и потребляющих место на диске.

Docker предоставляет все необходимые инструменты для очистки системы из командной строки. В этом руководстве с полезными советами кратко описываются полезные команды для освобождения места на диске и организации системы посредством удаления неиспользуемых образов, контейнеров и томов Docker.

Использование этого руководства:

  • Это руководство в формате полезных советов содержит автономные сниппеты для командной строки
  • Вы можете перейти к любому разделу, актуальному для задачи, которую вы пытаетесь выполнить.

Синтаксис замены команды command $(command), используемый в командах, доступен во многих популярных оболочках, включая bash, zsh и Windows Powershell.

Очистка всех неиспользуемых или не связанных с контейнерами образов, контейнеров, томов и сетей

В Docker имеется команда, очищающая все не связанные с контейнерами ресурсы, в том числе образы, контейнеры, тома и сети:

docker system prune

Чтобы удалить все остановленные контейнеры и неиспользуемые образы (а не только образы, не связанные с контейнерами), добавьте в эту команду флаг -a:

docker system prune -a

Удаление одного или нескольких конкретных образов

Используйте команду docker images с флагом -a, чтобы найти идентификатор удаляемых образов. Эта команда покажет вам все образы, включая промежуточные слои образов. Когда вы определитесь с составом удаляемых образов, вы можете передать их идентификаторы или теги в docker rmi:

Список:

docker images -a

Удаление:

docker rmi Image Image

Удаление образов, не привязанных к контейнеру

Образы Docker состоят из нескольких слоев. Несвязанные образы — это слои, не имеющие связей с каким-либо образами с тегами. У них нет никакого назначения, и они просто занимают место на диске. Их можно найти, добавив флаг фильтра -f со значением dangling=true в команду docker images. Если вы уверены, что хотите удалить их, вы можете использовать команду docker images purge:

Примечание. Если вы создали образ и не пометили его тегами, он будет отображаться в списке несвязанных образов, поскольку он не привязан к образу с тегом. Этого можно избежать, указав тег при сборке образа. Также вы можете помечать тегами уже существующие образы с помощью команды docker tag.

Список:

docker images -f dangling=true

Удаление:

docker images purge

Удаление образов по шаблону

Вы можете найти все образы, соответствующие определенному шаблону, используя комбинацию команд docker images и grep. Когда вы будете довольны, вы можете удалить их, используя awk для передачи идентификаторов в docker rmi. Эти утилиты не предоставляются Docker и могут быть доступны не во всех системах:

Список:

docker images -a |  grep "pattern"

Удаление:

docker images -a | grep "pattern" | awk '{print $3}' | xargs docker rmi

Удаление всех образов

Для вывода всех образов Docker в системе нужно добавить флаг -a в команду docker images. Если вы уверены, что хотите удалить их все, добавьте флаг -q для передачи идентификатора образа в docker rmi:

Список:

docker images -a

Удаление:

docker rmi $(docker images -a -q)

Удаление одного или нескольких конкретных контейнеров

Используйте команду docker ps с флагом -a для поиска имен или идентификаторов контейнеров, которые вы хотите удалить:

Список:

docker ps -a

Удаление:

docker rm ID_or_Name ID_or_Name

Удаление контейнера при выходе

Если вы создаете контейнер, который вам не будет нужен после завершения его использования, вы можете использовать команду docker run --rm для его автоматического удаления при выходе.

Запуск и удаление:

docker run --rm image_name

Удаление всех контейнеров, из которых выполнен выход

Вы можете найти контейнеры с помощью команды docker ps -a и отфильтровать их по статусу: created (создан), restarting (перезапускается), running (работает), paused (пауза) или exited (выполнен выход). Чтобы просмотреть список контейнеров, из которых выполнен выход, используйте флаг -f для фильтрации по статусу. Убедитесь, что вы хотите удалить эти контейнеры, и используйте флаг -q для передачи идентификаторов в команду docker rm.

Список:

docker ps -a -f status=exited

Удаление:

docker rm $(docker ps -a -f status=exited -q)

Удаление контейнеров с использованием нескольких фильтров

Фильтры Docker можно комбинировать, повторяя флаг фильтра с дополнительным значением. В результате выводится список контейнеров, соответствующих любому из указанных условий. Например, если вы хотите удалить все контейнеры со статусом Created (статус, который может возникнуть при запуске контейнера недопустимой командой) или Exited, вы можете использовать два фильтра:

Список:

docker ps -a -f status=exited -f status=created

Удаление:

docker rm $(docker ps -a -f status=exited -f status=created -q)

Удаление контейнеров по шаблону

Чтобы найти все контейнеры, соответствующие определенному шаблону, используйте сочетание команд docker ps и grep. Когда вы будете удовлетворены списком удаляемых контейнеров, используйте awk и xargs для передачи идентификаторов в команду docker rmi. Обратите внимание, что эти утилиты не поставляются Docker и могут быть доступны не во всех системах:

Список:

docker ps -a |  grep "pattern”

Удаление:

docker ps -a | grep "pattern" | awk '{print $3}' | xargs docker rmi

Остановка и удаление всех контейнеров

Для просмотра контейнеров в системе используется команда docker ps. При добавлении флага -a будет выведен список всех контейнеров. Если вы уверены, что хотите удалить их, добавьте флаг -q для передачи их идентификаторов командам docker stop и docker rm:

Список:

docker ps -a

Удаление:

docker stop $(docker ps -a -q)docker rm $(docker ps -a -q)

Удаление томов, удаление одного или нескольких томов — Docker 1.9 и выше

Используйте команду docker volume ls для определения названий томов, которые вы хотите удалить. Затем вы можете удалить один или несколько томов с помощью команды docker volume rm:

Список:

docker volume ls

Удаление:

docker volume rm volume_name volume_name

Удаление несвязанных томов - Docker 1.9 и выше

Поскольку тома существуют независимо от контейнеров, при удалении контейнера тома не удаляются автоматически. Если том существует, но не связан ни с какими контейнерами, он называется несвязанным томом. Чтобы найти такие тома и убедиться в необходимости их удаления, вы можете использовать команду docker volume ls с фильтром, чтобы в результатах выводились только несвязанные тома. Если список вас устроит, вы можете удалить все тома с помощью команды docker volume prune:

Список:

docker volume ls -f dangling=true

Удаление:

docker volume prune

Удаление контейнера и его тома

Если вы создали том без имени, его можно удалить одовременно с контейнером, используя флаг -v. Обратите внимание, что это работает только с томами без имени. При успешном удалении контейнера отображается его идентификатор. Обратите внимание на отсутствие указания на удаление тома. Если у тома нет имени, он удаляется из системы незаметно. Если у тома есть имя, он сохраняется в системе без уведомлений.

Удаление:

docker rm -v container_name

В этом руководстве рассказывается о некоторых распространенных командах, используемых для удаления образов, контейнеров и томов с помощью Docker. Существует много других комбинаций команд и флагов. Более полную информацию можно найти в документации Docker по командам docker system prune, docker rmi, docker rm и docker volume rm. Если вы хотели бы увидеть в этом руководстве часто встречающиеся задачи по очистке системы, задавайте вопросы и оставляйте свои предложения в комментариях.