Как очистить образы, контейнеры и тома Docker

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

Удаление всех неиспользуемых образов, контейнеров, томов и сетей

Для очистки неиспользуемых ресурсов в Docker есть специальная команда, позволяющая удалить все несвязанные образы, контейнеры, тома и сети – то есть не имеющие тэга или не используемые каким-либо контейнером:

docker system prune

Если нужны также все остановленные контейнеры и неиспользуемые образы – добавьте к команде флаг -a:

docker system prune -a

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

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

Получить список загруженных образов можно командой docker images -a. В выводе команды будут отображены:

  • репозиторий, из которого загружен образ;
  • тэг;
  • ID образа;
  • дата создания;
  • размер.

Пример вывода команды:

sudo docker images -a
REPOSITORY   TAG       IMAGE ID       CREATED         SIZE
ubuntu       22.04     ca2b0f26964c   11 months ago   77.9MB
ubuntu       18.04     f9a80a55f492   20 months ago   63.2MB

Для удаления образа используется команда docker rmi, которой необходимо передать ID или тэг образа. Например:

sudo docker rmi ubuntu:22.04
Untagged: ubuntu:22.04
Untagged: ubuntu@sha256:77906da86b60585ce12215807090eb327e7386c8fafb5402369e421f44eff17e
Deleted: sha256:ca2b0f26964cf2e80ba3e084d5983dab293fdb87485dc6445f3f7bbfc89d7459
Deleted: sha256:5498e8c22f6996f25ef193ee58617d5b37e2a96decf22e72de13c3b34e147591

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

Образы Docker состоят из нескольких слоев. Слои, не относящиеся к каким-либо образам с тэгом, считаются несвязанными и просто занимают дисковое пространство. Чтобы вывести список таких образов, используйте команду:

docker images -f dangling=true

Для удаления всех несвязанных образов можно использовать команду:

docker image prune
Обратите внимание!
Если при сборке собственного образа не указать тэг, образ также попадет в список несвязанных и будет удален при выполнении docker image prune. Чтобы избежать этого, задайте тэг при сборке образа или добавьте его после сборки командой docker tag.

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

Для фильтрации списка образов можно использовать комбинацию команд docker images и grep. После чего полученный список можно передать команде удаления образа – docker rmi. Например, чтобы вывести список всех образов, содержащих в названии “node”, используйте команду:

sudo docker images -a |  grep "node"

Для удаления таких образов используйте следующую команду:

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

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

Для вывода всех образов в системе используется команда docker images с ключом -a:

sudo docker images -a

Чтобы удалить все образы, используйте подстановку команды docker images -a -q в docker rmi:

sudo docker rmi $(sudo docker images -a -q)

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

Удаление определенных контейнеров

Команда docker rm позволяет удалить определенный контейнер, передав ей имя или ID контейнера. Чтобы узнать последние, используйте команду docker ps c флагом -a – она покажет список всех контейнеров, в том числе остановленных:

sudo docker ps -a

Пример вывода:

CONTAINER ID   IMAGE          COMMAND       CREATED         STATUS                   PORTS     NAMES
a19329fe35ac   ubuntu:18.04   "/bin/bash"   12 months ago   Exited (0) 4 weeks ago             node_build_env

Для удаления одного или нескольких контейнеров передайте docker rm ID или название контейнера:

sudo docker rm ID_or_Name ID_or_Name

Автоматическое удаление контейнера при остановке

Если вам не нужно сохранять контейнер по завершении его работы, можно передать флаг --rm команде docker run для его автоматического удаления:

sudo docker run --rm image_name

Удаление всех остановленных контейнеров

Команда docker ps -a поддерживает фильтрацию результата по их статусу:

  • created
  • restarting
  • running
  • paused
  • exited

Для получения списка контейнеров со статусом exited вам нужна следующая команда:

sudo docker ps -a -f status=exited

Для удаления таких контейнеров используйте подстановку команд:

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

Указанные выше фильтры можно совмещать, чтобы вывести все контейнеры, подпадающие под указанные категории. Так, например, чтобы вывести все контейнеры со статусами exited и created, команда будет выглядеть следующим образом:

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

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

Используя комбинацию docker ps и grep, можно получить список всех контейнеров, подпадающих под заданное регулярное выражение:

sudo docker ps -a |  grep "pattern”

Для удаления таких контейнеров добавьте комбинацию команд awk и xargs для передачи ID команде docker rm:

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

Как остановить и удалить все контейнеры

Вывести список всех контейнеров можно командой docker ps -a. Добавив флаг -q, можно получить список ID, который впоследствии можно передать командам docker stop и docker rm для остановки и удаления контейнеров соответственно:

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

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

Удаление определенных томов

Для вывода списка созданных томов используется команда docker volume ls:

sudo docker volume ls

Пример вывода:

DRIVER    VOLUME NAME
local     sample_volume

Удаление несвязанных томов

Поскольку тома существуют независимо от контейнеров, очистка Docker-контейнера не ведет к автоматическому удалению тома. Если том не используется каким-либо контейнером, он считается несвязанным. Для вывода всех подобных томов используется команда docker volume ls с флагом -f dangling=true:

sudo docker volume ls -f dangling=true

Для удаления всех подобных томов используйте следующую команду:

sudo docker volume prune

Заключение

В данной статье мы рассказали, как удаление неиспользуемых ресурсов Docker (очистка кэша сборки, образов, контейнеров, томов и т. д.) может освободить дисковое пространство.

Если возникнут вопросы, напишите нам, пожалуйста, тикет из панели управления аккаунта (раздел “Помощь и поддержка”), а если вы захотите обсудить эту статью или облачную инфраструктуру Beget – ждем вас в нашем сообществе в Telegram.

5
134