Docker — это программное обеспечение для быстрой развертки приложений за счет контейнеризации. Но при его активном использовании накапливается большое количество различных объектов, тратящих ценные ресурсы хоста: образы, контейнеры, тома и сети.
Удалять эти объекты можно и через Docker Desktop, но намного удобнее, особенно в случае немалого количества объектов, воспользоваться средствами командной строки. В этой статье вы получите советы по Docker и узнаете, как с помощью клиента Docker Desktop и инструментов командной строки удалять различные объекты.
Кстати, в Timeweb Cloud можно выгодно арендовать сервер с Docker.
Для того, чтобы взаимодействовать с контейнерами и изменять их текущее состояние, в том числе и удалять их, переходим на вкладку «Containers/Apps» веб-интерфейса Docker Desktop, выбираем нужный объект и применяем к нему выбранные нами действия:
Теперь рассмотрим, как удалять эти объекты с помощью средств командной строки.
Для удаления контейнеров используется команда docker container rm
или просто docker rm
. Для наглядности будем использовать docker container rm
с таким синтаксисом:
docker container rm [параметры удаления] [ID объектов]
Параметры:
--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
. Для это выполним эту команду для получения списка таких объектов:
docker ps -a -f status=created -f status=exited
Теперь передадим результат в команду для удаления:
docker container rm $(docker ps -a -f status=created -f status=exited -q)
kube
Для удаления запущенных контейнеров необходимо предварительно остановить их. Конечно, можно воспользоваться --force
, но это может привести к повреждениям данных, с которыми работает приложение. Всегда лучше сначала остановить контейнеры с помощью команды docker stop
. Чтобы в docker удалить все контейнеры, достаточно этих двух команд:
docker stop $(docker ps -a -q)
docker container rm $(docker ps -a -q)
Существует отдельная команда, с помощью которой можно удалить все остановленные контейнеры: docker container prune
.
Как и контейнеры, образы Docker можно удалить внутри клиент-приложения. Для этого переходим на вкладку образов или «Images»:
Для удаления нажимаем в верхнем правом углу «Clean up…» и выбираем нужные нам образы. Если образ в текущий момент используется в работе, то докер не позволит его удалить. Теперь перейдем к инструментам командной строки.
За удаление образов Docker отвечает две команды: docker rmi
и docker image rm
. Они идентичны и работают примерно также, как и docker rm
. Вот их синтаксис:
docker rmi [параметры удаления] [ID образов]
Параметры у неё такие:
--force
или -f
: принудительно удалить образ;--no-prune
: не удалять непомеченные (не связанные по TAG) родителей;Для того, чтобы узнать ID образов, будем использовать команду с таким синтаксисом:
docker images [параметры] [REPOSITORY:[TAG]]
У неё следующие параметры:
--all
или -a
: выводим все образы. По умолчанию промежуточные будут скрыты;--digests
: выводим дайджесты;--filter
или -f
: фильтр по флагам;--format
: формат вывода;--no-trunc
: не обрезать вывод;--quiet
или -q
: выводим только идентификаторы;Применение этих команд такое же, как и в предыдущем разделе этой статьи. Сначала мы запрашиваем нужный нам список образов и используем его как входной параметр для команды docker rmi
. В качестве примера избавимся от образов, не привязанных к контейнерам. Для этого воспользуемся флагом dangling=true
. Важно не забывать, что в этом случае мы получим несвязанные образы, т.е. без тегов:
docker images --filter dangling=true
После проверки списка мы можем с чистой совестью удалить его:
docker rmi $(docker images --filter dangling=true -q)
Для удаления всех неиспользуемых образов предусмотрена команда docker image prune
.
Том — это файловая система за пределами контейнеров, размещенная на хост-машине. Чтобы освободить пространство на диске от них, переходим в раздел «Volumes» и в правом верхнем углу выбираем соответствующую иконку:
За удаление томов в командной строке отвечает docker volume rm
с таким синтаксисом:
docker volume rm [параметры] [имена томов]
На параметры эта команда не щедра и предоставляет лишь принудительное удаление с помощью флага --force
или -f
. Удалить можно только те тома, что не связаны с работающими контейнерами. Использовать принудительное удаление нежелательно для томов, связанных с работающими контейнерами, поскольку это может привести к повреждению данных.
Для того, чтобы узнать имена томов, воспользуемся командной docker volume ls
. Синтаксис следующий:
docker volume ls [параметры]
И снова докер оказывается жадным на параметры. Предусмотрено 3 параметра:
--filter
или -f
: фильтр по флагам;--format
: формат вывода;--quiet
или -q
: выводим только имена.Тома существуют вне контейнеров и после их удалении остаются в файловой системе хоста и становятся несвязанными. Попробуем удалить такие тома. Для этого воспользуемся флагом dangling=true
:
docker volume ls -f dangling=true
Теперь передаём результаты в команду для их удаления:
docker volume rm $(docker volume ls -f dangling=true -q)
Но можно обойтись и другой командой для удаления таких томов: docker volume prune
. Она удаляет все неиспользуемые тома. Однако, перед использованием, всё же стоит проверить список и убедиться в нём.
Если вам нужно избавиться от безымянного тома, то его можно удалить вместе с его контейнером. Для этого при выполнении docker rm
необходимо добавить параметр -v
.
Чтобы удалить сети, необходимо воспользоваться командой docker network rm
с таким синтаксисом:
docker network rm [Имена/ID сетей]
У этой команды параметры отсутствуют. Ей можно передавать как имена, так ID. Для того, чтобы узнать имена и ID сетей, необходимо воспользоваться docker network ls
:
docker network ls [параметры]
У неё всего 4 параметра:
--filter
или -f
: фильтр по флагам;--format
: формат вывода;--no-trunc
: не обрезать вывод;--quiet
или -q
: выводим только идентификаторы;Прежде, чем удалять сеть, необходимо удалить объекты, которые её используют. Чтобы узнать, какие контейнеры используют ту или иную сеть, выполняем такую команду:
docker ps -f network=[ID сети]
После этого можно перейти непосредственно к удалению сети. Попробуем удалить сети со значением driver=bridge
:
docker network ls -f driver=bridge
docker network rm $(docker network ls -f driver=bridge -q)
Это довольно актуальная задача. Порой, для того, чтобы вернуть приложение в исходное состояния, приходится его удалять и заново устанавливать. Вместо того, чтобы удалить docker, можно составить перечень команд, которые позволят очистить его от всех объектов и работать с ним, как с новым:
1. Останавливаем и удаляем контейнеры:
docker stop $(docker ps -a -q)
docker rm $(docker ps -a -q)
2. Удаляем образы:
docker rmi $(docker images -a -q)
3. Удаляем тома:
docker volume rm $(docker volume ls -a -q)
4. Удаляем сети:
docker network rm $(docker network ls -a -q)
в разделе образы, в примерах, неправильно указана команда для фильтрации - стоит тире вместо двух дефисов
Поправили в статье. Спасибо, что сообщили 😊