Удалить/очистить все данные Докера (контейнеры, образы, тома и сети)
Одной строкой
docker stop $(docker ps -qa) && docker rm $(docker ps -qa) && docker rmi -f $(docker images -qa) && docker volume rm $(docker volume ls -q) && docker network rm $(docker network ls -q)
Описание команд
👎 Остановка всех контейнеров
docker stop $(docker ps -qa)
✊ Удаление всех контейнеров
docker rm $(docker ps -qa)
✌️ Удаление всех образов
docker rmi -f $(docker images -qa)
👋 Удаление всех томов
docker volume rm $(docker volume ls -q)
✋ Удаление всех сетей
docker network rm $(docker network ls -q)
Ваша инсталяция должна быть чиста 😊
👇 Следующие команды не должны выводить какие-либо элементы:
👉 Следующая команда показывает только сети по умолчанию:
:: Следующая команда удаляет неиспользуемые образы
Docker — один из наиболее востребованных инструментов в сфере разработки и DevOps. Однако порой образуется множество не нужных более образов, а также контейнеров и томов. Их переизбыток может приводить к замедлению работы приложений и загромождению диска, поэтому периодически нужно избавляться от этого мусора.
И надо сказать, что в Докере есть достаточно возможностей, чтобы периодически чистить систему, причем делать это можно непосредственно из командной строки. И когда вы запомните приведенные ниже команды, процесс очистки будет ненамного сложнее, чем использование «корзины» в ОС. И не забудьте заглянуть в «Заключение», которое обычно читают редко, но в данном случае мы решили включить туда полезное предостережение.
cloud
Удаляем все объекты
Сначала приведем команду, которая удаляет всё, включая и так называемые «висячие» объекты:
docker system prune
А для удаления остановленных объектов потребуется флаг -a, вот так:
docker system prune -a
Не используемые более образы уничтожаются так:
docker image prune -a
Эта команда включает также дочерние образы и метаданные.
Теперь избавляемся от всех контейнеров:
docker container prune
И, наконец, убираем тома:
docker volume prune
Чтобы убедиться, что вы удаляете правильные объекты, задействуйте флаги --dry-run или -n для просмотра объектов без их фактического уничтожения. Кроме того, эти команды удаляют объекты без возможности восстановления. Поэтому перед выполнением приведенных выше (и ниже) инструкций удостоверьтесь, что вы понимаете, какие объекты будут удалены, и вы не удаляете что-то важное.
Здесь рассмотрим основные инструкции по удалению определенного количества образов с заданными параметрами или без них.
Удаляем определенные образы
Для этого сначала вводим:
docker images -a
Команда позволяет отобразить список всех Docker-образов, которые находятся на локальной машине, включая не используемые в данный момент. Флаг -a указывает Docker на отображение всех имеющихся образов, а не только тех, которые были недавно созданы.
Далее вводим:
docker rmi Img Img
Вместо Img подставьте название для удаления. Несколько названий следует указывать через пробел.
Удаляем «висячие» образы
Чтобы получить перечень неиспользуемых образов (такие объекты также называются «висячими»), вводим:
docker images -f dangling=true
Такие образы могут возникать при создании новых на основе старых с тем же именем, но без тега. В этом случае старый образ становится висячим и не используется. -f фильтрует объекты по различным критериям, в данном случае мы выполняем фильтрацию, задав dangling=true.
Теперь для удаления неиспользуемых образов вводим:
docker image prune
Эта инструкция затрагивает висячие образы и те, которые более не используются. При выполнении этой инструкции образы будут удалены без возможности восстановления.
Удаляем по шаблону
Для поиска образов, содержащих некоторый шаблон в их именах, введите:
docker images -a | grep "pattern"
-a отображает все образы, в том числе неактивные и промежуточные. grep фильтрует вывод, чтобы отобразить только те образы, в именах которых содержится указанный шаблон (соответственно, введите его вместо "pattern", сохранив кавычки).
А чтобы избавиться от них, введите:
docker images -a | grep "pattern" | awk '{print $3}' | xargs docker rmi
awk '{print $3}' отображает только третий столбец вывода, содержащий идентификаторы. xargs docker rmi нужен, чтобы передать идентификаторов в docker rmi, удаляющей данные образы. xargs разбивает список идентификаторов образов на отдельные аргументы. Если вы пытаетесь удалить несколько образов, перечисляя их идентификаторы вручную, вы можете столкнуться с проблемой, если идентификаторы содержат пробелы или другие специальные символы. В этом случае использование xargs более безопасно и удобно.
Для удаления используемых образов введите:
docker rm -f $(docker ps -a -q)
Это остановит и уничтожит контейнеры перед удалением образов.
Удаляем все образы
Для отображения списка всех образов, которые находятся на локальной машине, включая не используемые в данный момент, вводим:
docker images -a
Далее для удаления всех неактивных образов на локальной машине вводим:
docker rmi $(docker images -a -q)
Эта команда выводит список идентификаторов всех образов на локальной машине и передает его в качестве аргумента docker rmi, которая удаляет все Docker-образы без возможности восстановления. А чтобы удалить и активные, используемые контейнерами, вводим:
docker rm -f $(docker ps -a -q)
Как удалить контейнеры Docker
В этой части рассмотрим все основные инструкции по удалению определенного количества контейнеров с заданными параметрами или без них.
Удаляем определенные контейнеры
Для начала вводим:
docker ps -a
Теперь вводим инструкцию для удаления:
docker rm Name_or_ID
Для ее корректного использования замените Name_or_ID соответствующим количеством ID или имен (несколько объектов следует указывать через пробел).
Также для удаления контейнера он должен быть остановлен. Если контейнер запущен, то сначала вводим:
docker stop Name_or_ID
А для уничтожения всех объектов этого типа на локальной машине введите:
docker rm $(docker ps -a -q)
Удаляем контейнеры при выходе
Для запуска нового контейнера на основе указанного образа введите, заменив имя на нужное:
docker run --rm image_name
Флаг --rm указывает Docker на удаление после остановки.
Теперь небольшое пояснение. По умолчанию созданный контейнер остается на локальной машине после остановки. И если вы не хотите сохранять контейнер, то задействуйте флаг --rm. Это очень удобно при запуске временных контейнеров для выполнения какой-то задачи, например, запуска тестов, когда вы не хотите оставлять за собой «мусор». А для сохранения данных помогут такие флаги, как -v для монтирования томов или -e для передачи переменных среды.
Удаляем все запущенные контейнеры
Сначала вводим:
docker ps -a -f status=exited
Флаг -f status=exited здесь фильтрует вывод.
Теперь для удаления вводим:
docker rm $(docker ps -a -f status=exited -q)
Удаляем контейнеры по нескольким фильтрам
Чтобы вывести контейнеры со статусами exited (остановлены) и created (созданы), то есть не запущенные и не работающие в данный момент, введите:
docker ps -a -f status=exited -f status=created
Флаги -a и -f здесь указывают Docker на отображение всех контейнеров и их фильтрацию.
Теперь для удаления всех объектов, которые находятся в состояниях exited или created, введите:
docker rm $(docker ps -a -f status=exited -f status=created -q)
Удаляем по шаблону
Для получения перечня контейнеров на локальной машине, а затем фильтрации списка, чтобы отобразить только те объекты, в именах которых есть определенный шаблон, введите, заменив "pattern" на нужный шаблон, сохраняя кавычки:
docker ps -a | grep "pattern"
Теперь для удаления объектов, в именах которых есть строка "pattern", вводим:
docker ps -a | grep "pattern" | awk '{print $1}' | xargs docker rm
Эта инструкция использует grep для фильтрации списка, awk '{print $1}' для извлечения первого столбца (идентификатора), а затем передает идентификаторы, используя xargs. Добавим, что docker ps -a | grep "pattern" может выводить не только имена, но и другую информацию: статус, ID и т.д. Поэтому для удаления объектов, в указанных параметрах которых есть строка "pattern", задействуйте инструкцию выше.
Останавливаем и удаляем все контейнеры
Для получения перечня контейнеров на локальной машине, включая не запущенные в данный момент, вводим знакомую инструкцию:
docker ps -a
Она покажет информацию о каждом объекте: идентификатор, имя, статус, задействованные ресурсы и т.д.
Для остановки всех контейнеров на локальной машине вводим:
docker stop $(docker ps -a -q)
И теперь удаляем их, вот так:
docker rm $(docker ps -a -q)
Как удалить тома Docker
В завершающей главе рассмотрим основные инструкции по удалению определенного количества томов с заданными параметрами или без них.
Удаляем определенные тома
Для получения перечня томов на локальной машине введите:
docker volume ls
Команда выводит список имеющихся томов, включая информацию о них (ID, имена).
Для удаления определенного числа томов с заданными именами введите, добавив имя нужного тома вместо vlm_name:
docker volume rm vlm_name
Эта команда принимает разное количество аргументов. Для удаления нескольких объектов перечислите их названия через пробел:
docker volume rm my_volume1 my_volume2
Если тома используются контейнерами, находящимися в работающем состоянии, их нельзя удалить, пока эти контейнеры не будут остановлены или удалены. Попытки уничтожить такие объекты будут сопровождаться выводом ошибки.
Удаляем висячие тома
Для получения перечня висячих томов на локальной машине введите:
docker volume ls -f dangling=true
Инструкция выводит их перечень, включая их ID и имена. Теперь можно избавиться от них, введя:
docker volume prune
Удалению подвергнутся все объекты данного типа, не ассоциированные ни с одним контейнером и не использующиеся на текущий момент.
Удаляем контейнер и его тома
Чтобы удалить тома, которые были созданы автоматически, вводим:
docker rm -v container_name
Флаг -v здесь указывает Docker на необходимость удаления всех связанных томов. Дело в том, что такие тома сохраняются на локальной машине, если не будут удалены явно. Поэтому такая операция может быть полезна для освобождения занимаемого не используемыми томами места на локальной машине.
Заключение
В завершение отметим, что перед тем, как выполнять инструкции по удалению образов, контейнеров и томов, нужно убедиться, что удаляемые объекты больше не потребуются вам или членам вашей команды. Ведь все эти операции — необратимые. А на этом всё, желаем успехов в работе с Docker!
Время на прочтение5 мин
Количество просмотров780K
Прим. перев.: Неделю назад Aymen El Amri, руководящий компанией eralabs и создавший обучающий курс «Безболезненный Docker», опубликовал свой Docker Cheat Sheet — шпаргалку по основным командам Docker. Git-репозиторий этого документа на GitHub уже набрал 1000+ stars и несколько сторонних контрибьюторов, что подтвердило его актуальность и пользу.
Представленные здесь команды описаны минимально (с акцентом на читаемость как есть) и включают в себя установку Docker, работу с реестрами и репозиториями, контейнерами, образами, сетью, Docker Swarm. Ниже представлен перевод шпаргалки в её состоянии на 2 сентября с дополнениями из комментариев ниже.
Установка
Linux
curl -sSL https://get.docker.com/ | sh
Mac
Скачайте dmg по этой ссылке:
https://download.docker.com/mac/stable/Docker.dmg
Windows
Используйте MSI-инсталлятор:
https://download.docker.com/win/stable/InstallDocker.msi
Реестры и репозитории Docker
Вход в реестр
docker login
docker login localhost:8080
Выход из реестра
docker logout
docker logout localhost:8080
Поиск образа
docker search nginx
docker search nginx -- filter stars=3 --no-trunc busybox
Pull (выгрузка из реестра) образа
docker pull nginx
docker pull eon01/nginx localhost:5000/myadmin/nginx
Push (загрузка в реестр) образа
docker push eon01/nginx
docker push eon01/nginx localhost:5000/myadmin/nginx
Первые действия с контейнерами
Создание контейнера
docker create -t -i eon01/infinite --name infinite
Первый запуск контейнера
docker run -it --name infinite -d eon01/infinite
Переименование контейнера
docker rename infinite infinity
Удаление контейнера
docker rm infinite
Обновление контейнера
docker update --cpu-shares 512 -m 300M infinite
Запуск и остановка контейнеров
Запуск остановленного контейнера
docker start nginx
Остановка
docker stop nginx
Перезагрузка
docker restart nginx
Пауза (приостановка всех процессов контейнера)
docker pause nginx
Снятие паузы
docker unpause nginx
Блокировка (до остановки контейнера)
docker wait nginx
Отправка SIGKILL (завершающего сигнала)
docker kill nginx
Отправка другого сигнала
docker kill -s HUP nginx
Подключение к существующему контейнеру
docker attach nginx
Получение информации о контейнерах
Работающие контейнеры
docker ps
docker ps -a
Логи контейнера
docker logs infinite
Информация о контейнере
docker inspect infinite
docker inspect --format '{{ .NetworkSettings.IPAddress }}' $(docker ps -q)
События контейнера
docker events infinite
Публичные порты
docker port infinite
Выполняющиеся процессы
docker top infinite
Использование ресурсов
docker stats infinite
Изменения в файлах или директориях файловой системы контейнера
docker diff infinite
Управление образами
Список образов
docker images
Создание образов
docker build .
docker build github.com/creack/docker-firefox
docker build - < Dockerfile
docker build - < context.tar.gz
docker build -t eon/infinite .
docker build -f myOtherDockerfile .
curl example.com/remote/Dockerfile | docker build -f - .
Удаление образа
docker rmi nginx
Загрузка репозитория в tar (из файла или стандартного ввода)
docker load < ubuntu.tar.gz
docker load --input ubuntu.tar
Сохранение образа в tar-архив
docker save busybox > ubuntu.tar
Просмотр истории образа
docker history
Создание образа из контейнера
docker commit nginx
Тегирование образа
docker tag nginx eon01/nginx
Push (загрузка в реестр) образа
docker push eon01/nginx
Сеть
Создание сети
docker network create -d overlay MyOverlayNetwork
docker network create -d bridge MyBridgeNetwork
docker network create -d overlay \
--subnet=192.168.0.0/16 \
--subnet=192.170.0.0/16 \
--gateway=192.168.0.100 \
--gateway=192.170.0.100 \
--ip-range=192.168.1.0/24 \
--aux-address="my-router=192.168.1.5" --aux-address="my-switch=192.168.1.6" \
--aux-address="my-printer=192.170.1.5" --aux-address="my-nas=192.170.1.6" \
MyOverlayNetwork
Удаление сети
docker network rm MyOverlayNetwork
Список сетей
docker network ls
Получение информации о сети
docker network inspect MyOverlayNetwork
Подключение работающего контейнера к сети
docker network connect MyOverlayNetwork nginx
Подключение контейнера к сети при его запуске
docker run -it -d --network=MyOverlayNetwork nginx
Отключение контейнера от сети
docker network disconnect MyOverlayNetwork nginx
Очистка Docker
Удаление работающего контейнера
docker rm nginx
Удаление контейнера и его тома (volume)
docker rm -v nginx
Удаление всех контейнеров со статусом exited
docker rm $(docker ps -a -f status=exited -q)
Удаление всех остановленных контейнеров
docker container prune
docker rm `docker ps -a -q`
Удаление контейнеров, остановленных более суток назад
docker container prune --filter "until=24h"
Удаление образа
docker rmi nginx
Удаление неиспользуемых (dangling) образов
docker image prune
docker rmi $(docker images -f dangling=true -q)
Удаление неиспользуемых (dangling) образов даже с тегами
docker image prune -a
Удаление всех образов
docker rmi $(docker images -a -q)
Удаление всех образов без тегов
docker rmi -f $(docker images | grep "^<none>" | awk "{print $3}")
Остановка и удаление всех контейнеров
docker stop $(docker ps -a -q) && docker rm $(docker ps -a -q)
Удаление неиспользуемых (dangling) томов
docker volume prune
docker volume rm $(docker volume ls -f dangling=true -q)
Удаление неиспользуемых (dangling) томов по фильтру
docker volume prune --filter "label!=keep"
Удаление неиспользуемых сетей
docker network prune
Удаление всех неиспользуемых объектов
docker system prune
По умолчанию для Docker 17.06.1+ тома не удаляются. Чтобы удалились и они тоже:
docker system prune --volumes
Docker Swarm
Установка Docker Swarm
curl -ssl https://get.docker.com | bash
Прим. перев.: в Docker версий 1.12.0+ ничего дополнительно устанавливать не требуется, т.к. Docker Swarm встроен в Docker Engine в виде специального режима (Swarm mode).
Инициализация Swarm
docker swarm init --advertise-addr 192.168.10.1
Подключение рабочего узла (worker) к Swarm
docker swarm join-token worker
Подключение управляющего узла (manager) к Swarm
docker swarm join-token manager
Список сервисов
docker service ls
Список узлов
docker node ls
Создание сервиса
docker service create --name vote -p 8080:80 instavote/vote
Список заданий Swarm
docker service ps
Масштабирование сервиса
docker service scale vote=3
Обновление сервиса
docker service update --image instavote/vote:movies vote
docker service update --force --update-parallelism 1 --update-delay 30s nginx
docker service update --update-parallelism 5--update-delay 2s --image instavote/vote:indent vote
docker service update --limit-cpu 2 nginx
docker service update --replicas=5 nginx
P.S.
Прим. перев.: Напомню, что оригинальная (англоязычная) версия Docker Cheat Sheet доступна и обновляется в Git-репозитории. Автор будет рад исправлениям/пополнениям от сообщества.
Читайте также в нашем блоге:
- «Техническая история Kubernetes: секреты создателя».
- «Некоторые моменты switchover в Patroni. Практические истории из SRE-будней. Часть 8»
- «Как запускать WebAssembly-приложения в Kubernetes с помощью Deckhouse».
| Введение | |
| Остановить в Windows | |
| Остановить в Linux | |
| Удалить контейнеры | |
| Удалить образы | |
| Статьи про Docker |
Остановить все контейнеры в Windows
В Windows cmd
FOR /f «tokens=*» %i IN (‘docker ps -q’) DO docker stop %i
В Windows batch файле
FOR /f «tokens=*» %%i IN (‘docker ps -q’) DO docker stop %%i
В
Windows PowerShell
docker ps -q | % { docker stop $_ }
Остановить все контейнеры в Linux
В
Linux
docker stop $(docker ps -aq)
или
sudo docker stop $(sudo docker ps -aq)
docker stop выполняется для всех контейнеров которые выводит команда
docker ps -a
Флаг q нужен для выполнения в фоновом режиме.
Он не является обязательным.
Удалить все контейнеры Docker
Нужно сделать то же самое, но вместо stop выполнить rm
Разберём для
Linux
docker rm $(docker ps -aq)
Альтернативный способ это system prune
docker system prune
WARNING! This will remove:
— all stopped containers
— all networks not used by at least one container
— all dangling images
— all dangling build cache
Are you sure you want to continue? [y/N] y
Deleted Containers:
60136dcc356d794d23aee10d3e6440fd53204ed88ad1c45f9bb70d0f66dd1cc4
85375f0f0e5e3d196ec7b11b4f7834aadee167de6c489ce4bf90b940ddec5ea8
33efc448ad6c67ee7e61336482dd7110a059e0c78d8b0a321f0f192ee26a048e
Deleted Images:
deleted: sha256:409d2b2d3c0b20cfb9556bb1e8c69c6e8e8b6120c3883396a5015f109f3f25cb
deleted: sha256:c26bbf7dc2369c5a9e316dbf6c8c0f79fd81b1dd92d5a4ee343060c96cabebf2
deleted: sha256:fcf59b2324beadaf9fc689bb205bc28915a78da42aee860bbb17bded2c54be13
deleted: sha256:c9952ac8387d7dc94e779d2663120f3e93a61a615b710fd7680f0dde63d0c411
deleted: sha256:7b5a2e67a82fb2512681822bfb4fae0b61c135b55ecc55b8fe0bc41ee7d60b40
deleted: sha256:bbdc7e06675baa525c1a65fbedcc3145f3271d49cf828ecd0f77aed5e31e740d
deleted: sha256:08908b45bd8a5b6340e89d9a401e39a04d4c81c66a75b4fc31528c042632bdf9
deleted: sha256:75ed22a7abbe9c23df78263501d5236b7a1dd9649fba94da3aee59ba277fc2c7
deleted: sha256:30f928cfbca4c67e9c284907b304b73a0804fa19b9d8ff22896c6afb79440638
deleted: sha256:b0573c5f42fec17a41f9633532e4f0c1ce77fc111aaec5fa9293bf3975459396
deleted: sha256:a1b7d51ce64b376af6d3e24f10689f04903f7f6174c07f8515127819c4d464f0
deleted: sha256:28115231ced77eebf1e319aacf77c7373f4845f13aa4fd21864cea5b79b5998f
deleted: sha256:954454106831e933798549935ed4bebb0683ccb0807cb4a0ce69537242418d4f
deleted: sha256:043dfc7ae5ae1671626dc1aa082f66791f8579bdcda25c1ccd9d7938c3a352b1
deleted: sha256:32083ac1bbb41043358d3bdf20d2cf6a2b95ddd583fc5f000e723f9ae508cf46
deleted: sha256:f5578f194936295078b78ff2ba8b14807da8b7df240627f3fb85be07bc69f74d
deleted: sha256:1fb565177c22d167b2f0271608e7c2e5a5868e19b36d30fd707604b4f23f0505
deleted: sha256:a1e12e8d24f2e61e9c73c7c29c23b09130fb119cd9672df7f9a03602c0beac84
deleted: sha256:ea493968f3d604b29a929813490d123a8171f2f8a23c67047866b4ee81d4df0c
deleted: sha256:285e528ab55c765304d41679ae7f9b69265bf954762f51b84379212d532ad6bd
deleted: sha256:b11f4e5c2b7fd12935b558f1c6361def6545574703eda262ca1c812c9e60680c
deleted: sha256:af0157c41f52fcf54e4ca265fb5e121b110b66309cebc8ebab09a44eeca21ad0
deleted: sha256:77a594b76fb550d04d4b5a8c2f82bfb7f3cd5b6ac14ac8ab7550de75eb9b86f1
deleted: sha256:1e11339a7869cee0f3b2dd099dd28e1f1f5f987a01639d3e5866efc1f3879cc5
deleted: sha256:dbfcd0b2c04a3ed04f4d99a2b1e65366b43421207230efb9fc30dac37c677fa8
Total reclaimed space: 177.4MB
Удалить все образы
Нужно сделать то же самое, но вместо rm выполнить rmi
а вместо ps выполнить images
Разберём для
Linux
docker rmi $(docker images -q)
Форсированное удаление выполняется с помощью флага —force
docker rmi —force 8d788d646766
Удалить всё
docker stop $(docker ps -aq)
docker rm $(docker ps -aq)
docker builder prune
docker rmi $(docker images -q)
docker system prune
Автор статьи: Андрей Олегович
Похожие статьи
| Docker | |
| Установка в Linux и Windows | |
| Основы | |
| images: Образы | |
| build: Создание контейнеров + примеры | |
| run: Опции запуска контейнера | |
| Сети | |
| Dockerfile | |
| Остановить/удалить все контейнеры | |
| exec: выполнить команду в контейнере | |
| compose | |
| Видеоуроки | |
| Ошибки | |
| Linux | |
| Windows |
Рассмотрим способы удаления различных артефактов Docker и элементов кэша сборки, которые занимают место на диске, по отдельности или полностью локально и в CI. Docker сохраняет кэш сборки, контейнеры, образы и тома на диске.
Со временем эти элементы могут занимать много места в вашей системе, как локально, так и в CI.
Кэширование слоев
Docker использует кэширование слоёв для повторного использования ранее вычисленных результатов сборки. Каждая инструкция в Dockerfile связана со слоем, который содержит изменения, вызванные выполнением этой инструкции.
Если предыдущие слои, а также входные данные для инструкции не изменились, а инструкция уже была выполнена и кэширована ранее, Docker будет использовать для неё кэшированный слой. В противном случае Docker перестроит этот слой и все последующие слои.
Использование кэшированного слоя выполняется намного быстрее, чем повторный расчёт инструкции с нуля. Поэтому, как правило, вы хотите, чтобы как можно большая часть сборки Docker выполнялась из кэша, а перестраивались только те слои, которые изменились с момента последней сборки.
Одним из основных факторов, влияющих на то, сколько слоёв в вашем образе необходимо пересобрать, является порядок операций в Dockerfile.
docker system df
docker system df
TYPE TOTAL ACTIVE SIZE RECLAIMABLE
Images 138 34 36.18GB 34.15GB (94%)
Containers 74 18 834.8kB 834.6kB (99%)
Local Volumes 118 6 15.31GB 15.14GB (98%)
Build Cache 245 0 1.13GB 1.13GB
К счастью, Docker позволяет освободить место на диске от неиспользуемых образов, контейнеров и томов.
Периодическая обрезка
Чтобы безопасно удалить остановленные контейнеры, неиспользуемые сети и висячие образы, рекомендуется время от времени выполнять следующую команду:
docker system prune
Несколько более рискованный вариант — это:
docker system prune -a
Это также удаляет все образы, не связанные с работающим контейнером. Это может показаться немного радикальным решением, но Docker повторно загрузит все необходимые образы. Первая попытка будет немного медленнее, но затем образ будет кэширован для дальнейшего использования.
В следующих разделах описаны дополнительные способы удаления определенных элементов.
Удаление Dockerimage
Docker образ — это снимок с диска приложения, такого как веб-сервер, языковая среда выполнения или система управления базами данных. Вы можете просмотреть все изображения, как активные, так и висячие (те, которые не связаны с контейнером), введя:
docker image ls -a
Изображение Docker можно удалить, введя:
docker image rm <name_or_id>
В эту команду можно добавить любое количество изображений — разделяйте их пробелами.
Удаление неиспользуемых Docker образов
Для удаления неиспользуемых образов из системы мы можем использовать команду docker image prune.
По умолчанию он удаляет только висячие изображения, которые не связаны ни с одним контейнером и не имеют тегов.
docker image prune -fDeleted Images:deleted: sha256:6f096c9fa1568f7566d4acaf57d20383851bcc433853df793f404375c8d975d6... Total reclaimed space: 2.751GB
Мы освободили более 2,7 ГБ памяти, удалив лишние изображения. Но, если мы вспомним вывод нашей docker system dfкоманды, у нас есть 34,15 ГБ удаляемых изображений.
Откуда берется остальная часть этого пространства? Это изображения в нашей системе, которые помечены или связаны с контейнером. Мы можем запустить команду docker image prune- a, чтобы принудительно удалить эти изображения, если они не используются.
docker image prune -a -fDeleted Images:untagged: k8s.gcr.io/etcd:3.4.13-0untagged: k8s.gcr.io/etcd@sha256:4ad90a11b55313b182afc186b9876c8e891531b8db4c9bf1541953021618d0e2deleted: sha256:0369cf4303ffdb467dc219990960a9baa8512a54b0ad9283eaf55bd6c0adb934deleted: sha256:f3cecccfe2bea1cbd18db5eae847c3a9c8253663bf30a41288f541dc1470b41e Total reclaimed space: 22.66GB
Таким образом мы удаляем все неиспользуемые изображения, не связанные с контейнером, а не только висящие в воздухе.
Удаление Docker контейнера
Docker контейнер — это запущенный экземпляр образа, и любое количество контейнеров может быть запущено из одного и того же. Контейнеры обычно небольшие, потому что они не имеют состояния и ссылаются на файловую систему образа. Просмотрите все контейнеры, как запущенные, так и остановленные, введя:
docker container ls -a
Вы можете удалить контейнер только после его остановки. Остановите контейнеры, введя:
docker container stop <name_or_id>
Затем контейнеры можно удалить, введя:
docker container rm <name_or_id>
Опять же, в эту команду можно добавить любое количество имён/идентификаторов контейнеров, разделённых пробелами.
Обычно нет необходимости сохранять остановленные контейнеры. Опцию — rm можно добавить к любой docker run команде, чтобы автоматически удалять контейнер после его завершения.
Мы можем использовать команду docker container prune для очистки дискового пространства, используемого контейнерами. Эта команда удалит из системы все остановленные контейнеры.
Здесь и в последующих примерах мы можем опустить флаг -f для получения запроса на подтверждение перед удалением артефактов.
docker container prune -fDeleted Containers:399d7e3679bf9b14a1c7045cc89c056f2efe31d0a32f186c5e9cb6ebbbf42c8e Total reclaimed space: 834.6kB
Какие контейнеры не используются?
Мы можем увидеть идентификаторы неиспользуемых контейнеров, выполнив команду docker ps с фильтрами по статусу контейнера. Контейнер считается неиспользуемым, если его статус равен exited или dead.
docker ps --filter status=exited --filter status=dead -q11bc2aa92622355901f38ecb263e9bde1f24
Удаление всех контейнеров
Если мы хотим удалить все контейнеры из системы, мы можем остановить все запущенные контейнеры, а затем использовать ту же команду prune. Для этого введите вывод команды docker ps -q в docker stop или docker kill команду, если вы хотите принудительно завершить работу контейнера.
docker stop $(docker ps -q)docker container prune
Другой вариант — это docker rm команда, которую можно использовать с docker ps -a -q для удаления всех контейнеров.
docker rm $(docker ps -a -q)
Примечание: Команда docker rm принудительно удаляет запущенный контейнер с помощью SIGKILL сигнала. Это то же самое, что и команда docker kill . Команда docker ps -a -q выводит список всех контейнеров в системе, включая запущенные, и передает его в команду docker rm .
Приведение в порядок сети
Контейнеры могут быть подключены к управляемой Docker сети, чтобы они могли взаимодействовать друг с другом. Это файлы конфигурации, которые не занимают много места на диске. Чтобы просмотреть все сети Docker, введите:
docker network ls
Одну или несколько неиспользуемых сетей можно удалить, введя:
docker network rm <name_or_id>
Опять же, в эту команду можно добавить любое количество сетевых имён/идентификаторов, разделённых пробелами.
Удаление томов
Docker Том — это образ виртуального диска. Его необходимо прикрепить к работающему контейнеру, чтобы он мог сохранять файлы или другую информацию о состоянии между перезапусками. Размеры тома зависят от приложения, использующего его, но типичной базе данных потребуется несколько сотен мегабайт пространства, даже если она в основном пуста.
Просмотрите все дисковые тома, управляемые Docker, введя:
docker volume ls
При удалении тома Docker все его данные будут безвозвратно удалены! Вернуться назад будет невозможно.
Если вы разрабатываете приложение на основе базы данных, обычно целесообразно сохранять один или несколько дампов данных, которые можно использовать для воссоздания определенного набора записей. Большинство клиентских инструментов для работы с базами данных предоставляют возможность дампа или экспорта, например, с помощью ссылки Экспорт в Adminer.
Большинство систем баз данных предоставляют инструмент для резервного копирования, такой как mysqldump утилита в MySQL. Их можно запустить в работающем контейнере с помощью docker exec команды.
Следующая команда Linux/macOS создает резервную копию базы данных MySQL с именем mydb, работающей в контейнере с именем mysql, в файл с именем backup.sql. Используется пользователь MySQL root с паролем mysecret:
docker exec mysql /usr/bin/mysqldump -u root -pmysecret mydb > backup.sql
эквивалентная команда для Windows PowerShell:
docker exec mysql /usr/bin/mysqldump -u root -pmysecret -r mydb | Set-Content backup.sql
Вы также можете копировать файлы данных в работающий контейнер или из него с помощью docker cp команды. При этом передаются пути к источнику и месту назначения, где контейнеры указываются по имени/идентификатору, за которым следует двоеточие и путь, например:
docker cp mycontainer:/some/file ./host/directory
Предполагая, что ваши данные в безопасности, вы можете удалить любой неиспользуемый том, введя:
docker volume rm <name>
Все неиспользуемые тома Docker — те, которые в данный момент не подключены к работающему контейнеру — можно удалить с помощью:
docker volume prune
В качестве альтернативы docker volume prune -a я удалю их все. Вы ведь сначала сделали резервную копию, не так ли?..
В Docker тома никогда не очищаются автоматически, потому что они могут содержать ценные данные. Но если мы знаем, что нам больше не нужны данные в томе, мы можем удалить его с помощью docker volume prune команды. Это удаляет все анонимные тома, которые не используются ни в одном контейнере.
docker volume prune -fTotal reclaimed space: 0B
Интересно, что мы видим, что не освободили ни одного места. Это происходит потому, что у нас есть тома, связанные с контейнерами. Мы можем увидеть эти тома, запустив docker volume ls
DRIVER VOLUME NAMElocal 0a44f085adc881ac9bb9cdcd659c28910b11fdf4c07aa4c38d0cca21c76d4ac4local 0d3ee99b36edfada7834044f2caa063ac8eaf82b0dda8935ae9d8be2bffe404c...
Мы получаем вывод, в котором отображается драйвер и имя тома. Команда docker volume prune удаляет только анонимные тома. Эти тома не имеют имени и не имеют конкретного источника за пределами контейнера. Мы можем использовать docker volume rm -a команду для удаления всех томов.
docker volume prune -a -fDeleted Volumes:c0c240b680d70fffef420b8699eeee3f0a49eec4cc55706036f38135ae121be02ce324adb91e2e6286d655b7cdaaaba4b6b363770d01ec88672e26c3e2704d9e Total reclaimed space: 15.31GB
Полный чистый старт
Все неиспользуемые контейнеры, образы, тома и сети можно удалить с помощью одной команды:
docker system prune -a --volumes
Добавьте -f если вы хотите принудительно выполнить очистку без запроса подтверждения. Ваша система вернется в исходное состояние без каких-либо данных Docker.
Очистка файлов Docker по CRON
Самый простой способ подчищать за Docker это — ежедневно запускать cron-задание для выполнения нашей команды обрезки.
docker system prune -af --filter "until=$((30*24))h"
команда, заставляющая docker удалить все неиспользуемые контейнеры
Давайте немного разберёмся, чтобы понять, что здесь происходит:
- Удаление неиспользуемых контейнеров в системе Docker — мы просим Docker удалить неиспользуемые контейнеры.
- -af — здесь мы объединили два флага. Добавление флага -a заставляет Docker искать не только зависшие контейнеры, но и все контейнеры, которые больше не используются. Флаг -f просто предотвращает появление запроса на подтверждение, который обычно появляется, когда пользователь подтверждает удаление.
Только одно предупреждение: «неиспользуемые» означает «изображения, на которые не ссылается ни один контейнер»: будьте осторожны при использовании -a!
- —filter — добавление фильтра позволяет указать возраст изображений, которые мы хотим удалить. В данном случае это любые изображения старше 30 дней или 1 месяца. Здесь мы используем базовую математику в bash, так как bash поддерживает только h (часы). Поэтому давайте вычислим 30 * 24 часа, что даст нам 1 месяц в часах, что обычно ограничивает количество контейнеров несколькими гигабайтами. Вы можете сократить это время, если у вас очень мало места на диске вашего VPS.
давайте создадим новый файл в Cron-файле для размещения нашей команды:
cd /etc/cron.daily
sudo nano docker-prune
Команда для создания нового файла в папке /etc/cron.daily/
Как только файл откроется, добавьте созданную нами команду prune и сообщите ОС, что это файл bash
#!/bin/bash
docker system prune -af --filter "until=$((30*24))h"
содержимое файла docker-prune, который мы только что создали
После добавления команды нажмите Ctrl + O, а затем Ctrl + X, чтобы сохранить и закрыть файл
Теперь, когда мы создали файл, нам нужно сообщить операционной системе, что он должен быть исполняемым, с помощью следующей команды:
sudo chmod +x /etc/cron.daily/docker-prune
команда, чтобы сделать файл, который мы только что создали, исполняемым
И это всё. Теперь Docker будет выполнять эту команду ежедневно.
Ссылки:
How to clean your Docker data
How to clear Docker cache and free up space on your system
How to Prune Docker Images Automatically with a Daily Cron job
