Docker — это программное обеспечение для быстрой развертки приложений за счет контейнеризации. Но при его активном использовании накапливается большое количество различных объектов, тратящих ценные ресурсы хоста: образы, контейнеры, тома и сети.
Удалять эти объекты можно и через Docker Desktop, но намного удобнее, особенно в случае немалого количества объектов, воспользоваться средствами командной строки. В этой статье вы получите советы по Docker и узнаете, как с помощью клиента Docker Desktop и инструментов командной строки удалять различные объекты.
Перенос серверов в облако
безопасно и с гарантией результата.
Предоставим грант до 1 000 000 ₽ на облачную
инфраструктуру и возьмем на себя весь процесс.
Удаляем контейнеры
Для того, чтобы взаимодействовать с контейнерами и изменять их текущее состояние, в том числе и удалять их, переходим на вкладку «Containers/Apps» веб-интерфейса Docker Desktop, выбираем нужный объект и применяем к нему выбранные нами действия.
Теперь рассмотрим, как удалять эти объекты с помощью средств командной строки.
Для удаления контейнеров используется команда docker container rm или просто docker rm. Для наглядности будем использовать docker container rm с таким синтаксисом:
Параметры:
--forceили-f: принудительное устранение контейнера (например, если он работает);--linkили-l: удалить указанную ссылку (например, между двумя объектами)*;--volumeили-v: удалить связанные с контейнером анонимные тома;
Контейнеры изолированы друг от друга. Один из способов связи между ними — через сетевые порты. Используя флаг --link, вы удалите эту связь в сети Docker.
Где взять ID? Для получения такой информации в арсенале командной строки имеется две команды: docker ps и docker container ls. Они имеют одинаковые параметры и синтаксис:
--allили-a: выводим все контейнеры. По умолчанию выводятся только запущенные;--filterили-f: фильтр по набору флагов;--format: формат вывода. Можно вывести не всю информацию, а только необходимую;--lastили-n: выводим последние n контейнеров;--latestили-l: вывести последний контейнер;--no-trunc: не обрезать вывод;--quietили-q: выводим только идентификаторы;--sizeили-s: вывод общего размера;
Манипулируя этими параметрами, пользователь может создать список контейнеров, которые он хочет удалить, после чего передать его ID команде docker container rm. Например, создать список объектов с флагами created или exited. Для это выполним эту команду для получения списка таких объектов:
Теперь передадим результат в команду для удаления:
Для удаления запущенных контейнеров необходимо предварительно остановить их. Конечно, можно воспользоваться --force, но это может привести к повреждениям данных, с которыми работает приложение. Всегда лучше сначала остановить контейнеры с помощью команды docker stop. Чтобы в Docker удалить все контейнеры, достаточно этих двух команд:
Существует отдельная команда, с помощью которой можно удалить все остановленные контейнеры: docker container prune.
Удаляем образы
Как и контейнеры, образы Docker можно удалить внутри клиент-приложения. Для этого переходим на вкладку образов или «Images».
Для удаления нажимаем в верхнем правом углу «Clean up…» и выбираем нужные нам образы.
Если образ в текущий момент используется в работе, то докер не позволит его удалить.
Теперь перейдем к инструментам командной строки.
За удаление образов Docker отвечает две команды: docker rmi и docker image rm. Они идентичны и работают примерно также, как и docker rm. Вот их синтаксис:
Параметры у неё такие:
--forceили-f: принудительно удалить образ;--no-prune: не удалять непомеченные (не связанные по TAG) родителей;
Для того, чтобы узнать ID образов, будем использовать команду с таким синтаксисом:
У нее следующие параметры:
--allили-a: выводим все образы. По умолчанию промежуточные будут скрыты;--digests: выводим дайджесты;--filterили-f: фильтр по флагам;--format: формат вывода;--no-trunc: не обрезать вывод;--quietили-q: выводим только идентификаторы;
Применение этих команд такое же, как и в предыдущем разделе этой статьи. Сначала мы запрашиваем нужный нам список образов и используем его как входной параметр для команды docker rmi. В качестве примера избавимся от образов, не привязанных к контейнерам. Для этого воспользуемся флагом dangling=true. Важно не забывать, что в этом случае мы получим несвязанные образы, т.е. без тегов:
После проверки списка мы можем с чистой совестью удалить его:
Для удаления всех неиспользуемых образов предусмотрена команда docker image prune.
Удаляем тома
Том — это файловая система за пределами контейнеров, размещенная на хост-машине. Чтобы освободить пространство на диске от них, переходим в раздел «Volumes» и в правом верхнем углу выбираем иконку удаления.
За удаление томов в командной строке отвечает docker volume rm с таким синтаксисом:
На параметры эта команда не щедра и предоставляет лишь принудительное удаление с помощью флага --force или -f. Удалить можно только те тома, что не связаны с работающими контейнерами. Использовать принудительное удаление нежелательно для томов, связанных с работающими контейнерами, поскольку это может привести к повреждению данных.
Для того, чтобы узнать имена томов, воспользуемся командной docker volume ls. Синтаксис следующий:
И снова докер оказывается жадным на параметры. Предусмотрено 3 параметра:
--filterили-f: фильтр по флагам;--format: формат вывода;--quietили-q: выводим только имена.
Тома существуют вне контейнеров и после их удалении остаются в файловой системе хоста и становятся несвязанными. Попробуем удалить такие тома. Для этого воспользуемся флагом dangling=true:
Теперь передаём результаты в команду для их удаления:
Но можно обойтись и другой командой для удаления таких томов: docker volume prune. Она удаляет все неиспользуемые тома. Однако, перед использованием, всё же стоит проверить список и убедиться в нём.
Если вам нужно избавиться от безымянного тома, то его можно удалить вместе с его контейнером. Для этого при выполнении docker rm необходимо добавить параметр -v.
Удаляем сети
Чтобы удалить сети, необходимо воспользоваться командой docker network rm с таким синтаксисом:
У этой команды параметры отсутствуют. Ей можно передавать как имена, так ID. Для того, чтобы узнать имена и ID сетей, необходимо воспользоваться docker network ls:
У неё всего 4 параметра:
--filterили-f: фильтр по флагам;--format: формат вывода;--no-trunc: не обрезать вывод;--quietили-q: выводим только идентификаторы;
Прежде, чем удалять сеть, необходимо удалить объекты, которые её используют. Чтобы узнать, какие контейнеры используют ту или иную сеть, выполняем такую команду:
После этого можно перейти непосредственно к удалению сети. Попробуем удалить сети со значением driver=bridge:
Бонус: очистка Docker от всех объектов
Это довольно актуальная задача. Порой, для того, чтобы вернуть приложение в исходное состояния, приходится его удалять и заново устанавливать. Вместо того, чтобы удалить Docker, можно составить перечень команд, которые позволят очистить его от всех объектов и работать с ним, как с новым:
1. Останавливаем и удаляем контейнеры:
2. Удаляем образы:
3. Удаляем тома:
4. Удаляем сети:
