Поиск по сайту:

Как удалить неиспользуемые ресурсы Docker


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

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

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

Обрезка висящих ресурсов

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

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

docker system prune

При выполнении команды отображается запрос подтверждения, в котором перечислены типы ресурсов для удаления. Введите y и нажмите Enter, чтобы продолжить удаление. Вы можете отключить подтверждение, передав флаг -f или --force.

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

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

Использование фильтров при обрезке

Фильтры можно использовать с командой prune. Фильтрация дает вам больше контроля над тем, что удаляется. В настоящее время поддерживаются два фильтра: until и timestamp.

  • until — фильтр until предотвращает удаление контейнеров, образов и сетей, созданных до заданного времени. Вы можете указать время в нескольких различных форматах, таких как временная метка Unix в секундах (например, 1614890000) или строка временной метки в формате даты (например, 2021-03-04T20:30:00).
  • label — фильтр label ограничивает удаление, поэтому удаляются только ресурсы с заданной меткой. Метки можно использовать с контейнерами, образами, сетями и томами. Вы указываете метки как label=key=value (ключ равен значению), label!=key=value (ключ не равен значению), label= key (имеет заданную метку) или label!=key (не имеет заданной метки).

Чтобы использовать фильтр, передайте его флагу --filter:

docker system prune --filter until=2021-03-04T20:30:00 --filter label=foo=bar

Эта команда удалит ресурсы с меткой foo=bar, созданные до 20:30 4 марта. Любые ресурсы, не соответствующие этому критерию, останутся нетронутыми.

Сокращение отдельных типов ресурсов

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

Флаги --force и --filter, поддерживаемые docker system prune, также применяются к отдельным командам prune, перечисленным ниже.

Контейнеры для обрезки

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

Запустите docker container prune, чтобы очистить остановленные контейнеры. Остановленные контейнеры не отображаются при запуске docker ps; чтобы увидеть их, вам нужно использовать docker ps -a, чтобы отобразить все контейнеры в вашей системе.

Если вы хотите удалить отдельный контейнер, используйте команду docker rm, передав идентификатор контейнера. Вы можете получить это, запустив docker ps. Если контейнер запущен, вам нужно будет использовать флаг --force, чтобы удалить его.

Обрезка изображений

Используйте docker image prune, чтобы удалить все висящие изображения. Подобно docker system prune, это повлияет на образы, которые либо не помечены, либо на которые не ссылается какой-либо контейнер.

Добавьте флаг -a, чтобы удалить все неиспользуемые изображения. Это удалит все образы в вашей системе, которые не требуются хотя бы для одного контейнера. Образы с тегами также будут включены, что позволит вам быстро удалить старые вытягивания из Docker Hub.

Вы можете удалить определенный образ с помощью команды docker rmi:

docker rmi wordpress:latest

Если у одного изображения есть несколько тегов, docker rmi удалит данный тег без фактического удаления изображения. Он будет удален после удаления последнего тега.

Обрезка сетей

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

Вы можете удалить отдельные сети, запустив docker rm my-network.

Обрезка томов

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

Если вы хотите удалить неиспользуемые тома, запустите docker volume prune. Это удалит все тома, которые не используются хотя бы одним контейнером. Отдельные тома можно удалить с помощью docker volume rm my-volume.

Предотвращение будущего накопления

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

При использовании с build это приведет к удалению промежуточных слоев сборки (отмеченных как : в docker images) . Это может означать значительное сокращение использования диска. Новый промежуточный уровень обычно создается для каждой инструкции в вашем Dockerfile. Обычно их можно удалить, если вы не собираетесь использовать их позже в качестве отправной точки для нового изображения.

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

Заключение

Сокращение ресурсов Docker может освободить место на диске и помочь вам работать с интерфейсом командной строки Docker. Устранение избыточных контейнеров и образов упрощает идентификацию ресурсов, которые вы ищете.

Docker ничего не удалит, если вы не скажете ему об этом. Стоит периодически запускать docker system prune, чтобы поддерживать чистоту вашей системы. Вы можете создать задачу cron, которая запускает ее ежемесячно, используя фильтр until, чтобы создать период хранения для недавно добавленных ресурсов.