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.