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

DockerDockerBeginner
Практиковаться сейчас

💡 Этот учебник переведен с английского с помощью ИИ. Чтобы просмотреть оригинал, вы можете перейти на английский оригинал

Введение

В этом практическом занятии (лабораторной работе) вы научитесь эффективно управлять дисковым пространством, удаляя неиспользуемые Docker-образы с помощью команды docker image prune. Сначала мы разберемся, для чего нужна эта команда и какие типы неиспользуемых образов она позволяет удалить, а именно "висящие" (dangling) образы и все неиспользуемые образы.

В ходе практических упражнений вы попрактикуетесь в удалении "висящих" образов, а затем расширите свои знания, удалив все неиспользуемые образы. Кроме того, вы узнаете, как использовать параметры фильтрации с командой docker image prune для выборочного удаления образов на основе таких критериев, как время создания и метки (labels), что даст вам детальный контроль над процессом очистки образов.


Skills Graph

%%%%{init: {'theme':'neutral'}}%%%% flowchart RL docker(("Docker")) -.-> docker/ImageOperationsGroup(["Image Operations"]) docker(("Docker")) -.-> docker/SystemManagementGroup(["System Management"]) docker(("Docker")) -.-> docker/DockerfileGroup(["Dockerfile"]) docker/ImageOperationsGroup -.-> docker/pull("Pull Image from Repository") docker/ImageOperationsGroup -.-> docker/rmi("Remove Image") docker/ImageOperationsGroup -.-> docker/images("List Images") docker/SystemManagementGroup -.-> docker/prune("Remove Unused Docker Objects") docker/DockerfileGroup -.-> docker/build("Build Image from Dockerfile") subgraph Lab Skills docker/pull -.-> lab-555158{{"Как использовать команду docker image prune для удаления неиспользуемых образов"}} docker/rmi -.-> lab-555158{{"Как использовать команду docker image prune для удаления неиспользуемых образов"}} docker/images -.-> lab-555158{{"Как использовать команду docker image prune для удаления неиспользуемых образов"}} docker/prune -.-> lab-555158{{"Как использовать команду docker image prune для удаления неиспользуемых образов"}} docker/build -.-> lab-555158{{"Как использовать команду docker image prune для удаления неиспользуемых образов"}} end

Понимание назначения команды docker image prune

На этом этапе мы разберемся, для чего нужна команда docker image prune. При работе с Docker на вашей системе неизбежно будут накапливаться неиспользуемые образы. Эти образы могут занимать значительное количество дискового пространства. Команда docker image prune используется для удаления этих неиспользуемых образов, что помогает освободить дисковое пространство.

Существует два основных типа неиспользуемых образов, которые можно удалить с помощью команды docker image prune:

  1. "Висящие" (Dangling) образы: Это образы, которые не имеют тегов (tags) и не используются ни одним контейнером. По сути, это промежуточные слои, которые больше не нужны.
  2. Все неиспользуемые образы: Включает в себя "висящие" образы, а также образы, которые не используются ни одним контейнером, даже если они имеют теги.

Начнем с создания нескольких "висящих" образов, чтобы увидеть, как работает команда docker image prune. Мы загрузим несколько разных версий образа ubuntu, а затем создадим новый образ на основе одного из них. Этот процесс часто оставляет "висящие" образы.

Сначала загрузите образы ubuntu:latest и ubuntu:18.04.

docker pull ubuntu:latest
docker pull ubuntu:18.04

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

Теперь создадим простой образ на основе ubuntu:latest. Создайте файл с именем Dockerfile в каталоге ~/project со следующим содержимым:

FROM ubuntu:latest
RUN echo "Hello, Docker!" >/app/hello.txt

Этот Dockerfile просто использует образ ubuntu:latest и добавляет файл hello.txt в каталог /app.

Теперь создайте образ с помощью команды docker build. Мы не будем добавлять тег этому образу, что поможет создать "висящий" образ.

docker build -t my-ubuntu-app ~/project

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

docker images -a

Найдите образы с <none> в столбцах REPOSITORY и TAG. Это "висящие" образы.

По умолчанию команда docker image prune предназначена для удаления этих "висящих" образов. На следующем этапе мы используем эту команду для очистки "висящих" образов, которые мы только что создали.

Удаление "висящих" образов с помощью команды docker image prune

На предыдущем этапе мы создали несколько "висящих" образов, создав образ без указания конкретного тега. На этом этапе мы используем команду docker image prune для удаления этих "висящих" образов.

По умолчанию команда docker image prune удаляет только "висящие" образы. Это самый безопасный способ очистить неиспользуемые слои образов, не удалив случайно образы, которые вам могут еще понадобиться, даже если они в данный момент не связаны с запущенным контейнером.

Для удаления "висящих" образов просто выполните команду docker image prune:

docker image prune

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

WARNING! This will remove all dangling images.
Are you sure you want to continue? [y/N]

Введите y и нажмите Enter, чтобы продолжить удаление.

После завершения выполнения команды будет отображено общее количество освобожденного пространства.

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

docker images -a

Вы больше не должны видеть образы с <none> в столбцах REPOSITORY и TAG, которые были видны до выполнения команды docker image prune. Образы ubuntu:latest, ubuntu:18.04 и my-ubuntu-app должны остаться, так как они не являются "висящими".

Это демонстрирует базовое использование команды docker image prune для удаления "висящих" образов. Это хорошая практика, которую рекомендуется выполнять периодически, чтобы освободить дисковое пространство на вашем Docker-хосте.

Удаление всех неиспользуемых образов с помощью команды docker image prune -a

На предыдущем этапе мы узнали, как удалить "висящие" образы с помощью команды docker image prune. Хотя удаление "висящих" образов полезно, на вашей системе могут быть и другие образы, которые в данный момент не используются ни одним контейнером, но не являются "висящими" (то есть они имеют теги). Чтобы удалить также эти образы, вы можете использовать флаг -a (или --all) с командой docker image prune.

Команда docker image prune -a удаляет все неиспользуемые образы, а не только "висящие". Это более радикальная очистка и ее следует использовать с осторожностью, так как она удалит любой образ, который в данный момент не связан с запущенным контейнером.

Давайте посмотрим, как это работает. Сначала выведем список образов, которые у нас есть в данный момент.

docker images

Вы должны увидеть ubuntu:latest, ubuntu:18.04 и my-ubuntu-app. Эти образы в данный момент не используются ни одним запущенным контейнером, но они не являются "висящими", так как имеют теги.

Теперь выполните команду docker image prune -a:

docker image prune -a

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

WARNING! This will remove all images without at least one container associated to them.
Are you sure you want to continue? [y/N]

Введите y и нажмите Enter, чтобы продолжить.

После завершения выполнения команды будет отображено общее количество освобожденного пространства.

Теперь выведем список образов снова, чтобы увидеть, какие из них остались.

docker images

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

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

Фильтрация образов для удаления на основе времени создания

В дополнение к удалению всех неиспользуемых образов, команда docker image prune позволяет фильтровать, какие образы будут рассмотрены для удаления на основе различных критериев. Одним полезным фильтром является фильтр на основе времени создания образа. Это позволяет удалить образы, созданные до определенной точки во времени.

Для применения фильтров используется флаг --filter. Чтобы отфильтровать по времени создания, используйте фильтр until. Фильтр until принимает в качестве значения временную метку или продолжительность времени. Образы, созданные после указанного времени, будут сохранены, в то время как те, которые были созданы до или в указанное время, будут рассмотрены для удаления.

Сначала загрузим несколько образов с разными временами создания. Загрузим alpine:latest и centos:latest.

docker pull alpine:latest
docker pull centos:latest

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

docker images

Обратите внимание на столбец CREATED для каждого образа.

Для демонстрации фильтрации по времени нам нужна точка отсчета. Предположим, что мы хотим удалить образы, созданные более 5 минут назад. Мы можем указать фильтр until с продолжительностью времени, например 5m.

docker image prune -a --filter "until=5m"

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

WARNING! This will remove all images without at least one container associated to them.
Are you sure you want to continue? [y/N]

Введите y и нажмите Enter, чтобы подтвердить.

После удаления образов выведем список образов снова:

docker images

В зависимости от того, как давно вы загрузили образы и выполнили команду удаления, некоторые образы могут быть удалены. Образы, созданные за последние 5 минут, должны остаться.

Вы также можете указать конкретную временную метку в различных форматах. Например, чтобы удалить образы, созданные до определенной даты и времени, вы можете использовать формат, такой как "2023-10-27T10:00:00".

Фильтрация по времени создания полезна для автоматизации задач очистки, обеспечивая сохранение на вашей системе только относительно новых образов.

Фильтрация образов для удаления на основе меток (labels)

На этом последнем этапе мы рассмотрим еще один мощный вариант фильтрации для команды docker image prune: фильтрацию на основе меток (labels). Метки - это пары ключ-значение, которые вы можете прикрепить к объектам Docker, включая образы, чтобы добавить метаданные. Затем вы можете использовать эти метки для фильтрации и управления ресурсами Docker.

Флаг --filter с ключом label позволяет вам указать, какие образы включать или исключать из процесса удаления на основе их меток.

Сначала создадим несколько образов с разными метками. Мы будем использовать простой Dockerfile и собрать два образа с разными метками.

Создайте файл с именем Dockerfile.labeled в директории ~/project со следующим содержимым:

FROM alpine:latest
LABEL environment="development"
LABEL version="1.0"
RUN echo "This is a labeled image" >/app/info.txt

Теперь соберите два образа из этого Dockerfile, применяя разные метки во время процесса сборки с помощью флага --label.

docker build -t my-labeled-app:dev --label project=myapp --label stage=dev ~/project -f Dockerfile.labeled
docker build -t my-labeled-app:prod --label project=myapp --label stage=prod ~/project -f Dockerfile.labeled

Теперь мы собрали два образа, my-labeled-app:dev и my-labeled-app:prod, оба основанные на одном и том же Dockerfile, но с разными метками stage.

Выведем список образов и проверим их метки.

docker images --filter reference="my-labeled-app*" --format "{{.Repository}}:{{.Tag}} {{.Labels}}"

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

Теперь используем команду docker image prune для удаления образов на основе их меток. Предположим, что мы хотим удалить все неиспользуемые образы, которые имеют метку stage=dev. Мы можем использовать флаг --filter с label=stage=dev. Также мы будем использовать флаг -a, чтобы рассмотреть все неиспользуемые образы, а не только "висящие".

docker image prune -a --filter "label=stage=dev"

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

После удаления образов выведем список образов снова:

docker images --filter reference="my-labeled-app*" --format "{{.Repository}}:{{.Tag}} {{.Labels}}"

Вы должны увидеть, что образ my-labeled-app:dev был удален, в то время как my-labeled-app:prod остался, так как он не соответствовал фильтру.

Вы также можете использовать синтаксис label!=key=value для удаления образов, которые не имеют определенной метки или значения метки. Например, чтобы удалить все неиспользуемые образы, которые не имеют метку stage=prod:

docker image prune -a --filter "label!=stage=prod"

Эта команда удалит my-labeled-app:dev (если он все еще существовал) и любые другие неиспользуемые образы, которые не имеют метки stage=prod.

Фильтрация по меткам предоставляет гибкий способ управления и очистки ваших образов на основе ваших собственных определенных метаданных.

Резюме

В этом практическом занятии (лабораторной работе) мы научились использовать команду docker image prune для управления дисковым пространством путем удаления неиспользуемых образов Docker. Мы начали с понимания назначения этой команды и типов неиспользуемых образов, на которые она нацелена: "висящие" образы (без тегов и не имеющие ссылок на них) и все неиспользуемые образы (включая образы с тегами, но не имеющие ссылок на них). Затем мы практиковались в идентификации и удалении "висящих" образов с помощью базовой команды docker image prune.

Мы также рассмотрели возможности команды docker image prune, изучив, как удалить все неиспользуемые образы с помощью флага -a. Наконец, мы узнали, как использовать опции фильтрации для выборочного удаления образов на основе таких критериев, как время создания и метки (labels), что позволяет более детально управлять очисткой образов.