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 prunedocker 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 поддерживает фильтрацию результата по их статусу:
createdrestartingrunningpausedexited
Для получения списка контейнеров со статусом 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.