Как удалить overlay docker centos

Обновлено: 06.07.2024

Docker позволяет быстро упаковать приложение или сервис в контейнер, который можно запустить в любом окружении. Однако при работе с Docker быстро накапливаются ненужные образы, контейнеры и тома данных, которые засоряют вывод и потребляют дисковое пространство.

Docker не предоставляет прямых команд для чистки, однако он предлагает набор инструментов для чистки системы с помощью командной строки. Это руководство представляет собой шпаргалку по командам Docker для чистки дискового пространства и системы путём удаления ненужных образов, контейнеров и томов.

Как пользоваться руководством?

Необязательно выполнять все разделы последовательно; выполняйте только необходимые разделы.

Синтаксис команд command $(command) доступен во многих популярных оболочках (bash, zsh, Windows Powershell).

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

Удаление конкретного образа

Команда docker images с флагом –a позволяет узнать ID образа, который нужно удалить. Она отображает все образы, включая промежуточные уровни. Определив образы, которые нужно удалить, вы можете передать их ID команде docker rmi:

docker images -a
docker rmi Image1 Image2

Удаление недействительных образов

Образы Docker состоят из нескольких уровней. Недействительные образы – это уровень образов, которые больше не имеют никакого отношения к образам с метками. Они впустую потребляют дисковое пространство. Чтобы найти такие образы, используйте команду docker images и флаг –f (filter) со значением dangling=true. Если вы уверены, что хотите удалить все эти образы, добавьте в команду docker rmi флаг –q и укажите ID образов через пробел.

docker images -f dangling=true

Чтобы найти и удалить образы:

docker rmi $(docker images -f dangling=true -q)

Примечание: Если при создании образа не были добавлены метки, такой образ также окажется в списке недействительных образов, так как у него нет никакой связи с метками. Чтобы избежать этого, добавляйте метки при сборке образа. Команда docker tag позволяет добавить метку после сборки образа.

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

С помощью команд docker images и grep можно найти все образы, соответствующие шаблону. Чтобы удалить все совпадающие с шаблоном образы, можно передать команде docker rmi ID всех образов с помощью команды awk. Имейте в виду: эти утилиты не предоставляются платформой Docker и не всегда доступны в системе по умолчанию.

docker ps -a | grep "шаблон"

чтобы удалить образы:

docker images | grep "шаблон" | awk '' | xargs docker rm

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

Чтобы просмотреть все доступные образы Docker, добавьте флаг -a в команду docker images.

docker images -a

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

docker rmi $(docker images -a -q)

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

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

Команда docker ps с флагом –a отображает все доступные контейнеры (их имена или ID).

Чтобы удалить контейнер (или несколько контейнеров), передайте имя или ID команде docker rm:

docker rm ID_или_имя_контейнера ID_или_имя_контейнера1

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

Если при сборке контейнера вы точно знаете, что после выполнения задачи он станет ненужным, вы можете автоматически удалить его с помощью docker run –rm. Как только контейнер выполнит свою задачу и остановится, он будет удалён.

docker run --rm имя_контейнера

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

С помощью команды docker ps –a, флага –f и параметра status вы можете найти все доступные контейнеры, которые находятся в определённом состоянии: created, restarting, running, paused и exited. Например:

docker ps -a -f status=exited

Чтобы удалить все остановленные контейнеры, используйте флаг –q в команде docker rm и передайте ей ID контейнеров, которые нужно удалить:

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

Удаление контейнера с помощью нескольких фильтров

Фильтры Docker можно комбинировать. Для этого нужно просто повторно добавить флаг –f. К примеру, чтобы вывести все контейнеры со статусом created (контейнер был создан, но запущен с помощью неправильной команды) и exited, можно использовать команду:

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

Чтобы удалить эти контейнеры, нужно ввести:

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

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

Поиск контейнеров по шаблону можно выполнить с помощью команд docker ps и grep.

docker ps -a | grep "шаблон"

Найдя все контейнеры, которые соответствуют заданному шаблону, вы можете удалить их с помощью команд docker rmi, awk и xargs.

Примечание: Эти утилиты не всегда поставляются системой по умолчанию.

docker ps -a | grep "шаблон" | awk '' | xargs docker rmi

Остановка и удаление контейнера

Чтобы просмотреть все контейнеры в системе, введите:

Чтобы удалить контейнеры, передайте их ID командам docker stop и docker rm с помощью флага –q:

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

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

Удаление конкретного тома (Docker 1.9 +)

Чтобы узнать имя тома (или томов), используйте команду:

docker volume ls

Чтобы удалить том, укажите его имя в команде docker volume rm. Чтобы удалить несколько томов, укажите их имена через пробел.

docker volume rm том1 том2 том3

Удаление недействительных томов (Docker 1.9 +)

Том должен существовать независимо от контейнера. Следовательно, когда контейнер удаляется, том не удаляется автоматически. Он остаётся в системе, хотя больше не обслуживает ни один контейнер. Такие тома считаются недействительными и просто занимают место на диске.

Чтобы найти такие тома, используйте команду:

docker volume ls -f dangling=true

Чтобы удалить недействительные тома, используйте:

docker volume rm $(docker volume ls -f dangling=true -q)

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

Если вы создали безымянный том, вы можете удалить его вместе с контейнером с помощью флага –v.

Примечание: Это работает только с безымянными контейнерами!

Когда контейнер успешно удалён, на экране отображается его ID. При этом в команде никак не обозначается удаление контейнера. Если том не имеет имени, он будет просто удалён из системы. Если у тома есть имя, он останется в системе.

docker rm -v имя_контейнера

Заключение

Данное руководство предлагает вам общие команды по удалению контейнеров, образов и томов Docker 1.9 +. Существует множество полезных комбинаций и флагов, которые не были описаны в этой статье. Узнать о доступных опциях можно в документации Docker для команд docker rmi, docker rm и docker volume rm.



Привет, Хабр! Представляю вашему вниманию перевод статьи "Docker Tips: Clean Up Your Local Machine" автора Luc Juggery.

Сегодня мы поговорим о том, как Docker использует дисковое пространство хостовой машины, а также разберемся в том, как это пространство освободить от ошметков неиспользуемых образов и контейнеров.




Общее потребление

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

Однако, за все эти прелести современной жизни приходится платить. Когда мы запускаем контейнеры, скачиваем или создаем собственные образы, разворачиваем сложные экосистемы, нам приходится платить. И платим мы, в том числе, дисковым пространством.

Если вы никогда не задумывались о том, сколько же места реально занято на вашей машине Docker’ом, то можете быть неприятно удивлены выводом этой команды:



Здесь отображено использование диска Docker’ом в различных разрезах:

  • образы (images) – общий размер образов, которые были скачаны из хранилищ образов и построены в вашей системе;
  • контейнеры (containers) – общий объем дискового пространства, используемый запущенными контейнерами (имеется ввиду общий объем слоев чтения-записи всех контейнеров);
  • локальные тома (local volumes) – объем локальных хранилищ, примонтированных к контейнерам;
  • кэш сборки (build cache) – временные файлы, сгенерированные процессом построения образов (при использовании инструмента BuildKit, доступного начиная с Docker версии 18.09).

Готов поспорить, что уже после этого простого перечисления вы горите желанием почистить диск от мусора и вернуть к жизни драгоценные гигабайты (прим. перев.: особенно, если за эти гигабайты вы ежемесячно перечисляете арендную плату).

Использование диска контейнерами

Каждый раз при создании контейнера на хостовой машине в каталоге /var/lib/docker создается несколько файлов и каталогов, среди которых стоит отметить следующие:

  • Каталог /var/lib/docker/containers/ID_контейнера – при использовании стандартного драйвера логгирования именно сюда сохраняются журналы событий в JSON-формате. Слишком подробные логи, а также логи, которые никто не читает и не обрабатывает иными способами, часто становятся причиной переполнения дисков.
  • Каталог /var/lib/docker/overlay2 – содержит слои чтения-записи контейнеров (overlay2 – предпочитаемые драйвер в большинстве дистрибутивов Linux). Если контейнер сохраняет данные в своей файловой системе, то именно в этом каталоге они и будут размещены.

Давайте представим себе систему, на которой установлен девственно чистый Docker, ни разу не участвовавший в запуске контейнеров и сборке образов. Его отчет об использовании дискового пространства будет выглядеть так:

Запустим какой-нибудь контейнер, например, NGINX:

Что происходит с диском:

  • образы (images) занимают 126 Мб, это тот самый NGINX, который мы запустили в контейнере;
  • контейнеры (containers) занимают смешные 2 байта.

Судя по выводу, у нас еще нет пространства, которое мы могли бы высвободить. Так как 2 байта это совершенно несерьезно, давайте представим, что наш NGINX неожиданно для всех написал куда-то 100 Мегабайт данных и создал внутри себя файл test.img именно такого размера.

Снова исследуем использование дискового пространства на хосте. Мы увидим, что контейнер (containers) занимает там 100 Мегабайт.

Думаю, ваш пытливый мозг уже задается вопросом, где же находится наш файл test.img. Давайте его поищем:

Не вдаваясь в подробности можно отметить, что файл test.img удобно расположился на уровне чтения-записи, управляемом драйвером overlay2. Если же мы остановим наш контейнер, то хост подскажет нам, что это место, в принципе, можно высвободить:

Как мы можем это сделать? Удалением контейнера, которое повлечет за собой очистку соответствующего пространства на уровне чтения-записи.

С помощью следующей команды вы можете удалить все установленные контейнеры одним махом и очистить ваш диск от всех созданных ими на уровне чтения-записи файлов:

Итак, мы высвободили 104,9 Мегабайта удалением контейнера. Но так как мы уже не используем скачанный ранее образ, то он тоже становится кандидатом на удаление и высвобождение наших ресурсов:

Внимание: до тех пор, пока образ используется хотя бы одним контейнером, вы не сможете использовать этот трюк.

Субкоманда prune, которую мы использовали выше, дает эффект только на остановленных контейнерах. Если мы хотим удалить не только остановленные, но и запущенные контейнеры, следует использовать одну из этих команд:

Заметки на полях: если при запуске контейнера использовать параметр --rm, то при его остановке будут высвобождено все дисковое пространство, которое он занимал.

Использование диска образами

Есть несколько типов образов, которые напрямую не видны конечному пользователю:

  • intermediate образы, на основе которых собраны другие образы в – они не могут быть удалены, если вы используете контейнеры на базе этих самых «других» образов;
  • dangling образы – это такие intermediate образы, на которые не ссылается ни один из запущенных контейнеров – они могут быть удалены.
  • С помощью следующей команды вы можете проверить наличие в вашей системе dangling образов:

Удалить их можно следующим способом:

Мы можем использовать также субкоманду prune:

Если мы вдруг захотим удалить вообще все образы (а не только dangling) одной командой, то можно сделать так:

Использование диска томами

Тома (volumes) применяются для хранения данных за пределами файловой системы контейнера. Например, если мы хотим сохранить результаты работы какого-либо приложения, чтобы использовать их как-то еще. Частым примером являются базы данных.

Давайте запустим контейнер MongoDB, примонтируем к нему внешний по отношению к контейнеру том, и восстановим из него бэкап базы данных (у нас он доступен в файле bck.json):

Данные будут находиться на хостовой машине в каталоге /var/lib/docker/volumes. Но почему не на уровне чтения-записи контейнера? Потому что в Dockerfile образа MongoDB каталог /data/db (в котором MongoDB по умолчанию хранит свои данные) определен как том (volume).




Заметки на полях: многие образы, в результате работы которых должны создаваться данные, используют тома (volumes) для сохранения этих самых данных.

Когда мы наиграемся с MongoDB и остановим (а может даже и удалим) контейнер, том не будет удален. Он продолжит занимать наше драгоценное дисковое пространство до тех пор, пока мы явно не удалим его такой командой:

Ну или мы можем использовать уже знакомую нам субкоманду prune:

Использование диска для кэша сборки образов

В Docker 18.09 процесс создания образов претерпел некоторые изменения благодаря инструменту BuildKit. С помощью этой штуки увеличивается скорость процесса, оптимизируется управление хранением данных и безопасностью. Здесь мы не будем рассматривать все детали этого замечательного инструмента, остановимся лишь нам том, как он затрагивает вопросы использования дискового пространства.

Предположим, что у нас есть совершенно простое приложение Node.Js:

Dockerfile для сборки образа выглядит так:

Давайте соберем образ обычным способом, без использования BuildKit:

Если мы проверим использование дискового пространства, то увидим, что место занимают только базовый образ (node:13-alpine) и конечный образ (app:1.0):

Давайте соберем вторую версию нашего приложения, уже с использованием BuildKit. Для этого нам лишь необходимо установить переменную DOCKER_BUILDKIT в значение 1:

Если мы сейчас проверим использование диска, то увидим, что теперь там участвует кэш сборки (buid-cache):

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

Очистить все!

Итак, мы рассмотрели очистку дискового пространства, занятого контейнерами, образами и томами. В этом нам помогает субкоманда prune. Но ее можно использовать и на системном уровне docker, и она очистит все, что только сможет:

Если вы по каким-либо причинам экономите дисковое пространство на машине с Docker, то периодический запуск этой команды стоит ввести в привычку.

Когда я впервые начал использовать docker, он меня поразил. Уверен, что и вы испытали нечто подобное. Время шло, а docker не переставал меня удивлять. Например, однажды он занял все свободное место на диске. Пока я останавливал и запускал контейнеры, скачивал классные штуки с docker hub, гигабайты быстро таяли, заполняясь висячими (dangling) томами, остановленными контейнерами и ненужными образами.

Запомнить их довольно сложно, и я поместил эти команды в скрипт. В общем, для очистки можно использовать специальные контейнеры, например docker-gc от spotify, или запомнить команды (да, я знаю: когда разберешься с функциями команд, они запомнятся сами собой). Однако вы можете не захотеть выполнять все эти процедуры для очистки docker-окружения.

До команды Docker дошла информация об этой проблеме, и в версии 1.13 был реализован набор легко запоминаемых команд очистки, которые теперь доступны в рамках базовой команды system. Давайте на них взглянем.


Использование базовой команды docker system

Осмотр docker-окружения

Команда docker system df выдает подробную статистику о контейнерах, образах и томах. Она также сообщает, сколько места можно освободить, выполнив очистку.


docker system df


Подробная информация о docker-окружении, полученная с помощью docker system df -v

Верните себе драгоценное пространство

Очистить систему можно с помощью команды docker system prune. По умолчанию будут удалены остановленные контейнеры, висячие образы (слои, не связанные с используемыми образами), тома и сети, не относящиеся к работающим контейнерам. Опция -a позволяет удалить не только висячие, но и вообще все неиспользуемые образы (не ассоциированные с запущенными контейнерами). Опция -f подавляет запросы на подтверждения. Обе опции по умолчанию выключены.


docker system prune


Удаляем неиспользуемые образы с помощью docker system prune -a

Команда prune полезна в том случае, когда нужно удалить только висячие образы и остановленные контейнеры. Выполнив docker image prune, docker container prune, вы избавитесь от ненужных образов и контейнеров.


Удаляем все ненужные контейнеры с помощью docker container prune


Удаляем все ненужные образы с помощью docker image prune

Подытожим: приведенные ниже команды (с опциями и вариациями) помогут освободить место на диске:

Надеюсь, теперь и у вас есть набор простых команд, которые позволят с легкостью вернуть утраченное дисковое пространство. Спасибо за внимание.

И ещё одна интересная выжимка фактов о докере, которая поможет в кратчайшие сроки начать его продуктивное использование. Цель данной статьи…

В продолжение прошлой статьи рассмотрим пример настройки ротации логов контейнеров на примере CentOs 7. В моём случае stdout и stderr контейнеров…

С недавнего времени начал рассматривать переход с lxc-контейнеров под управлением Proxmox на более гибкий Docker, в основе которого лежат те…

Favorite

Добавить в избранное

Главное меню » Операционная система Linux » Как удалить контейнеры-докеры, изображения, тома и сети

(1 оценок, среднее: 5,00 из 5)

Установить Docker 1.11 на Ubuntu 16.04 LTS x64

D ocker позволяет быстро создавать, тестировать и развертывать приложения в качестве переносных самодостаточных контейнеров, которые могут работать практически повсеместно.

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

Это руководство служит «шпаргалкой», чтобы помочь пользователям Docker организовать свою систему и освободить место на диске, удалив неиспользуемые контейнеры, изображения, тома и сети Docker.

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

Команда docker system prune удалит все остановленные контейнеры, все оборванные изображения и все неиспользуемые сети:

Вам будет предложено продолжить, используйте флаг -f или --force чтобы обойти запрос.

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

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

Контейнеры-докеры не удаляются автоматически при их остановке, если вы не запускаете контейнер с использованием флага --rm .

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

Для удаления одного или нескольких изображений Docker используйте команду docker container rm , за которой следует идентификатор контейнеров, которые вы хотите удалить.

Вы можете получить список всех активных и неактивных контейнеров, передав флаг -a команде docker container ls :

Результат должен выглядеть примерно так:

Как только вы узнаете о контейнерах CONTAINER ID , которые хотите удалить, перейдите к команде docker container rm . Например, чтобы удалить первые два контейнера, перечисленных в приведенном выше выпуске, выполните:

Если вы получите ошибку, аналогичную приведенной ниже, это означает, что контейнер запущен. Перед удалением контейнера необходимо остановить контейнер.

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

Перед выполнением команды удаления вы можете получить список всех неработающих (остановленных) контейнеров, которые будут удалены с помощью следующей команды:

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

Вам будет предложено продолжить, используйте флаг -f или --force для обхода запроса.

Удаление контейнеров с использованием фильтров

Команда docker container prune позволяет удалять контейнеры на основе условия с использованием флага фильтрации --filter . На момент написания этой статьи в настоящее время поддерживаются фильтры являются until и label . Вы можете использовать несколько фильтров, передавая несколько флагов --filter .

Например, чтобы удалить все изображения, созданные более 12 часов назад, выполните:

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

Вы можете получить список всех контейнеров Docker в вашей системе с помощью команды docker container ls -aq .

Чтобы остановить все запущенные контейнеры, используйте команду docker container stop , за которой следует список, из всех идентификаторов контейнеров.

После остановки всех контейнеров вы можете удалить их, используя команду docker container stop , за которой следует список идентификаторов контейнеров.

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

Удаление одного или нескольких изображений

Чтобы удалить один или несколько изображений Docker, используйте команду docker images ls , чтобы найти идентификатор изображений, которые вы хотите удалить.

Результат должен выглядеть примерно так:

После того как вы расположены изображения , которые вы хотите удалить, передать их IMAGE ID в команду docker image rm . Например, чтобы удалить первые два изображения, перечисленные в приведенном выше выводе, выполните:

Если вы получили ошибку, аналогичную приведенной ниже, это означает, что изображение используется существующим контейнером. Чтобы удалить изображение, вам нужно сначала удалить контейнер.

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

Docker предоставляет команду docker image prune , которая может использоваться для удаления оборванных и неиспользуемых изображений.

Вам будет предложено продолжить, используйте флаг -f или --force для обхода запроса.

При удалении оборванных изображений, если созданные вами изображения не помечены, они также будут удалены.

Чтобы удалить все изображения, на которые не ссылается какой-либо существующий контейнер, а не только свисающие, используйте флаг -a :

Удаление изображений с использованием фильтров

С помощью команды docker image prune вы можете удалить изображения на основе условия, используя флаг фильтрации --filter . На момент написания этой статьи в настоящее время поддерживаются фильтры являются until и label . Вы можете использовать несколько фильтров, передавая несколько флагов --filter .

Например, чтобы удалить все изображения, созданные более 12 часов назад, выполните:

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

Удаление одного или нескольких томов

Чтобы удалить один или несколько тонов Докера, используйте команду docker volume ls , чтобы найти идентификатор томов, которые вы хотите удалить.

Результат должен выглядеть примерно так:

Когда вы найдете тома VOLUME NAME , которые хотите удалить, передайте их команде docker volume rm . Например, чтобы удалить первый том, указанный в выведенном выше выпуске:

Если вы получили ошибку, аналогичную следующей, это означает, что этот том используется существующим контейнером. Чтобы удалить том, вам нужно сначала удалить контейнер.

Удаление неиспользуемых томов

Чтобы удалить все неиспользуемые тома, используйте команду docker image prune :

Вам будет предложено продолжить, используйте флаг -f или --force для обхода запроса.

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

Удалите одну или несколько сетей

Чтобы удалить одну или несколько сетей Docker, используйте команду docker network ls , чтобы найти идентификатор сетей, которые вы хотите удалить.

Результат должен выглядеть примерно так:

После того как вы расположены сети , которые вы хотите удалить, передать их NETWORK ID в команду docker network rm . Например, чтобы удалить сеть с именем my-bridge-network выполните:

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

Удалить неиспользуемую сеть

Используйте команду docker network prune для удаления всех неиспользуемых сетей.

Вам будет предложено продолжить, используйте флаг -f или --force для обхода запроса.

Удаление сетей с использованием фильтров

С помощью команды docker network prune вы можете удалить сети на основе условия, используя флаг фильтрации --filter . На момент написания этой статьи в настоящее время поддерживаются фильтры являются until и label . Вы можете использовать несколько фильтров, передавая несколько флагов --filter .

Например, чтобы удалить все сети, созданные более 12 часов назад, запустите:

Заключение

В этом руководстве мы показали вам некоторые из общих команд для удаления контейнеров, изображений, томов и сетей Docker.

Если у вас есть какие-либо вопросы, пожалуйста, оставьте комментарий ниже.

Если вы нашли ошибку, пожалуйста, выделите фрагмент текста и нажмите Ctrl+Enter.

Читайте также: