Как эффективно удалять образы, контейнеры и тома Docker?

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

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

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

Как удалить образы, контейнеры, тома и сети Docker? (Пошаговый гайд)

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

docker system prune

Приведённая выше команда очищает неиспользуемые ресурсы Docker, удаляя контейнеры Docker, «висячие» (dangling) образы, неиспользуемые тома и сети, не подключённые ни к одному контейнеру. По умолчанию она удаляет только те ресурсы, которые безопасно удалять. Добавление флага --all позволяет удалить все неиспользуемые образы, а не только «висячие».

Чтобы удалить контейнер Docker, который сейчас не запущен, и все неиспользуемые образы (включая те, что не являются «висячими»), добавьте к команде флаг -a.

docker system prune -a

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

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

docker images -a

Определив нужные образы, удалите их командой docker rmi, указав их ID или тег.

docker rmi Image Image

Удаление «висячих» образов Docker

Образы Docker состоят из нескольких слоёв, а «висячие» образы - это слои, не связанные ни с одним образом с тегом. Такие слои не нужны и занимают место на диске. 

Если вы собираете образ без назначения тега, он будет отображаться как «висячий», поскольку не связан ни с одним образом с тегом. Чтобы этого избежать, всегда указывайте тег при сборке образа. Также можно добавить тег к существующему образу позже с помощью команды docker tag.

Найти их можно командой docker images с флагом -f и значением dangling=true. Убедившись, что хотите их удалить, воспользуйтесь командой docker image prune, чтобы удалить «висячие» образы.

docker images -f dangling=true

Теперь вы можете удалить эти образы с помощью приведённой ниже команды:

docker image prune

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

Просмотреть все образы Docker в системе можно с помощью команды docker images с флагом -a. 

docker images -a

Решив их удалить, добавьте флаг -q, чтобы вывести только ID образов, которые затем можно передать команде docker rmi для удаления.

docker rmi $(docker images -a -q)

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

Чтобы удалить образы по определённому шаблону, можно объединить команду docker images и grep для фильтрации образов. 

docker images -a | grep "pattern"

Определив образы, воспользуйтесь awk, чтобы извлечь их ID, и передайте их команде docker rmi для удаления. Имейте в виду, что эти утилиты не встроены в Docker и могут быть доступны не во всех системах.

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

Удаление контейнеров Docker

Чтобы удалить конкретные контейнеры, воспользуйтесь командой docker ps с флагом -a, чтобы вывести список всех контейнеров. 

docker ps -a

Приведённая выше команда позволит найти имена или ID контейнеров, которые вы хотите удалить. Перед удалением контейнера может быть полезно сначала проверить, что в нём, открыв интерактивную оболочку с помощью docker exec. Теперь, если вы хотите удалить контейнер, это можно сделать следующей командой:

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 и отфильтруйте по статусу. 

docker ps -a -f status=exited

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

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

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

Найти контейнеры, соответствующие определённому шаблону, можно, объединив команду docker ps и grep. 

docker ps -a | grep "pattern"

Отфильтровав контейнеры, которые вы хотите удалить, воспользуйтесь awk и xargs, чтобы передать их ID команде docker rm. Имейте в виду, что эти утилиты не входят в состав Docker и могут быть доступны не во всех системах.

docker ps -a | grep "pattern" | awk '{print $1}' | xargs docker rm

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

В Docker можно применить несколько фильтров, указав флаг filter несколько раз, каждый раз с другим значением. Это позволяет вывести контейнеры, соответствующие любому из заданных условий. Например, чтобы удалить все контейнеры, которые находятся в состоянии «created» (это может произойти, если контейнер запущен с неверной командой) или завершили работу, можно использовать два отдельных фильтра.

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

Чтобы удалить эти контейнеры, воспользуйтесь следующей командой:

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

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

Чтобы просмотреть все контейнеры в вашей системе, воспользуйтесь командой docker ps. Добавив флаг -a, вы увидите все контейнеры, включая остановленные.

docker ps -a

Когда будете готовы их удалить, воспользуйтесь флагом -q, чтобы получить ID контейнеров, и передайте их командам docker stop и docker rm, чтобы остановить и удалить контейнеры.

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

Удаление томов Docker

Чтобы найти имена томов, которые вы хотите удалить, воспользуйтесь командой docker volume ls. 

docker volume ls

Определив тома, вы можете удалить один или несколько из них с помощью команды docker volume rm.

docker volume rm volume_name volume_name

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

Если вы создаёте контейнер с безымянным томом, можно удалить и контейнер, и том одновременно с помощью флага -v. Это работает только для безымянных томов. 

docker rm -v container_name

После удаления контейнера будет выведен его ID, но об удалении тома прямо не упоминается. Если том безымянный, он будет незаметно удалён из системы. Однако если у него есть имя, том останется в системе и не будет удалён.

Удаление «висячих» томов Docker

Тома существуют независимо от контейнеров, поэтому при удалении контейнера связанный с ним том автоматически не удаляется. Если том больше не подключён ни к одному контейнеру, он становится «висячим». 

Чтобы найти такие тома, воспользуйтесь командой docker volume ls с фильтром, который показывает только «висячие» тома. 

docker volume ls -f dangling=true

Проверив список, вы можете удалить их все сразу командой docker volume prune.

docker volume prune

Заключение

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

Ищете стабильную производительность и масштабируемые решения для своих проектов? Откройте для себя BlueVPS.com.ua: простые, настраиваемые и выделенные среды с неограниченным трафиком и отличной доступностью облака. Не откладывайте, ознакомьтесь прямо сейчас и повысьте производительность своего VPS уже сегодня!

 

Blog