Удаление образов, контейнеров, томов и сети Docker
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)
Для удаления запущенных контейнеров необходимо предварительно остановить их. Конечно, можно воспользоваться —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 [параметры]
- —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 от всех объектов
Это довольно актуальная задача. Порой, для того, чтобы вернуть приложение в исходное состояния, приходится его удалять и заново устанавливать. Вместо того, чтобы удалить docker , можно составить перечень команд, которые позволят очистить его от всех объектов и работать с ним, как с новым:
1. Останавливаем и удаляем контейнеры:
docker stop $(docker ps -a -q)
docker rm $(docker ps -a -q)
docker rmi $(docker images -a -q)
docker volume rm $(docker volume ls -a -q)
docker network rm $(docker network ls -a -q)
docker rmi
Refer to the options section for an overview of available OPTIONS for this command.
Description
Removes (and un-tags) one or more images from the host node. If an image has multiple tags, using this command with the tag as a parameter only removes the tag. If the tag is the only one for the image, both the image and the tag are removed.
This does not remove images from a registry. You cannot remove an image of a running container unless you use the -f option. To see all images on a host use the docker image ls command.
For example uses of this command, refer to the examples section below.
Options
Name, shorthand | Default | Description |
—force , -f | Force removal of the image | |
—no-prune | Do not delete untagged parents |
Examples
You can remove an image using its short or long ID, its tag, or its digest. If an image has one or more tags referencing it, you must remove all of them before the image is removed. Digest references are removed automatically when an image is removed by tag.
$ docker images REPOSITORY TAG IMAGE ID CREATED SIZE test1 latest fd484f19954f 23 seconds ago 7 B (virtual 4.964 MB) test latest fd484f19954f 23 seconds ago 7 B (virtual 4.964 MB) test2 latest fd484f19954f 23 seconds ago 7 B (virtual 4.964 MB) $ docker rmi fd484f19954f Error: Conflict, cannot delete image fd484f19954f because it is tagged in multiple repositories, use -f to force 2013/12/11 05:47:16 Error: failed to remove one or more images $ docker rmi test1:latest Untagged: test1:latest $ docker rmi test2:latest Untagged: test2:latest $ docker images REPOSITORY TAG IMAGE ID CREATED SIZE test latest fd484f19954f 23 seconds ago 7 B (virtual 4.964 MB) $ docker rmi test:latest Untagged: test:latest Deleted: fd484f19954f4920da7ff372b5067f5b7ddb2fd3830cecd17b96ea9e286ba5b8
If you use the -f flag and specify the image’s short or long ID, then this command untags and removes all images that match the specified ID.
$ docker images REPOSITORY TAG IMAGE ID CREATED SIZE test1 latest fd484f19954f 23 seconds ago 7 B (virtual 4.964 MB) test latest fd484f19954f 23 seconds ago 7 B (virtual 4.964 MB) test2 latest fd484f19954f 23 seconds ago 7 B (virtual 4.964 MB) $ docker rmi -f fd484f19954f Untagged: test1:latest Untagged: test:latest Untagged: test2:latest Deleted: fd484f19954f4920da7ff372b5067f5b7ddb2fd3830cecd17b96ea9e286ba5b8
An image pulled by digest has no tag associated with it:
$ docker images --digests REPOSITORY TAG DIGEST IMAGE ID CREATED SIZE localhost:5000/test/busybox sha256:cbbf2f9a99b47fc460d422812b6a5adff7dfee951d8fa2e4a98caa0382cfbdbf 4986bf8c1536 9 weeks ago 2.43 MB
To remove an image using its digest:
$ docker rmi localhost:5000/test/busybox@sha256:cbbf2f9a99b47fc460d422812b6a5adff7dfee951d8fa2e4a98caa0382cfbdbf Untagged: localhost:5000/test/busybox@sha256:cbbf2f9a99b47fc460d422812b6a5adff7dfee951d8fa2e4a98caa0382cfbdbf Deleted: 4986bf8c15363d1c5d15512d5266f8777bfba4974ac56e3270e7760f6f0a8125 Deleted: ea13149945cb6b1e746bf28032f02e9b5a793523481a0a18645fc77ad53c4ea2 Deleted: df7546f9f060a2268024c8a230d8639878585defcc1bc6f79d2728a13957871b