Как эффективно удалять образы, контейнеры и тома 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