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

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

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

Введение

В этом лабораторном занятии (LabEx) вы научитесь эффективно управлять томами Docker, сконцентрировавшись на команде docker volume prune. Мы начнем с создания и изучения различных типов томов, включая именованные тома и тома с метками (labels), чтобы понять их свойства и то, как Docker управляет ими.

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


Skills Graph

%%%%{init: {'theme':'neutral'}}%%%% flowchart RL docker(("Docker")) -.-> docker/ContainerOperationsGroup(["Container Operations"]) docker(("Docker")) -.-> docker/ImageOperationsGroup(["Image Operations"]) docker(("Docker")) -.-> docker/VolumeOperationsGroup(["Volume Operations"]) docker(("Docker")) -.-> docker/SystemManagementGroup(["System Management"]) docker/ContainerOperationsGroup -.-> docker/run("Run a Container") docker/ContainerOperationsGroup -.-> docker/ls("List Containers") docker/ContainerOperationsGroup -.-> docker/rm("Remove Container") docker/ContainerOperationsGroup -.-> docker/inspect("Inspect Container") docker/ImageOperationsGroup -.-> docker/pull("Pull Image from Repository") docker/VolumeOperationsGroup -.-> docker/volume("Manage Volumes") docker/SystemManagementGroup -.-> docker/prune("Remove Unused Docker Objects") subgraph Lab Skills docker/run -.-> lab-555261{{"Как использовать команду docker volume prune для удаления неиспользуемых томов"}} docker/ls -.-> lab-555261{{"Как использовать команду docker volume prune для удаления неиспользуемых томов"}} docker/rm -.-> lab-555261{{"Как использовать команду docker volume prune для удаления неиспользуемых томов"}} docker/inspect -.-> lab-555261{{"Как использовать команду docker volume prune для удаления неиспользуемых томов"}} docker/pull -.-> lab-555261{{"Как использовать команду docker volume prune для удаления неиспользуемых томов"}} docker/volume -.-> lab-555261{{"Как использовать команду docker volume prune для удаления неиспользуемых томов"}} docker/prune -.-> lab-555261{{"Как использовать команду docker volume prune для удаления неиспользуемых томов"}} end

Создание и изучение некоторых томов

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

Сначала создадим именованный том с помощью команды docker volume create. Назовем этот том myvolume.

docker volume create myvolume

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

Теперь изучим только что созданный том с помощью команды docker volume inspect. Эта команда предоставляет подробную информацию о томе, такую как его имя, драйвер и точка монтирования на хост-машине.

docker volume inspect myvolume

Результатом будет массив JSON, содержащий информацию о томе. Найдите поле "Mountpoint", которое показывает расположение на хосте, где хранятся данные тома. Docker управляет этим расположением, и обычно не рекомендуется напрямую изменять файлы в этом каталоге.

Далее создадим еще один том, на этот раз с меткой (label). Метки полезны для организации и фильтрации объектов Docker. Создадим том с именем labeled_volume и добавим метку app=web.

docker volume create --label app=web labeled_volume

Снова имя тома будет выведено при успешном создании.

Наконец, изучим labeled_volume, чтобы увидеть добавленную метку.

docker volume inspect labeled_volume

В выходных данных в формате JSON вы должны найти поле "Labels", содержащее метку app=web.

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

На этом этапе мы создадим контейнер Docker и прикрепим к нему том myvolume, который мы создали на предыдущем этапе. Это продемонстрирует, как данные могут сохраняться даже после удаления контейнера.

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

docker pull ubuntu

Эта команда загружает образ ubuntu с Docker Hub.

Теперь запустим контейнер на основе образа ubuntu и смонтируем том myvolume в каталог /app внутри контейнера. Также мы запустим команду, которая запишет некоторые данные в файл в смонтированном томе.

docker run -d --name mycontainer -v myvolume:/app ubuntu /bin/bash -c "echo 'Hello from the container!' > /app/data.txt; sleep 30"

Разберем эту команду по частям:

  • docker run: Эта команда используется для запуска нового контейнера.
  • -d: Этот флаг запускает контейнер в отсоединенном режиме (detached mode), то есть он работает в фоновом режиме.
  • --name mycontainer: Это присваивает контейнеру имя mycontainer, что упрощает его ссылку.
  • -v myvolume:/app: Это важная часть для использования тома. Она монтирует именованный том myvolume в каталог /app внутри контейнера.
  • ubuntu: Это указывает образ, который будет использоваться для контейнера.
  • /bin/bash -c "echo 'Hello from the container!' > /app/data.txt; sleep 30": Это команда, выполняемая внутри контейнера. Она использует bash для выполнения двух команд: сначала она записывает строку "Hello from the container!" в файл с именем data.txt в каталоге /app (который является смонтированным томом), а затем делает контейнер "спать" в течение 30 секунд, чтобы он продолжал работать в течение короткого времени.

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

docker ps

Вы должны увидеть mycontainer в списке вывода со статусом "Up".

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

docker rm -f mycontainer

Флаг -f принудительно удаляет контейнер, даже если он все еще запущен.

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

docker run --rm -v myvolume:/app ubuntu cat /app/data.txt

Разберем эту команду по частям:

  • docker run: Запускает новый контейнер.
  • --rm: Этот флаг автоматически удаляет контейнер при его выходе.
  • -v myvolume:/app: Монтирует том myvolume в /app в этом новом контейнере.
  • ubuntu: Использует образ ubuntu.
  • cat /app/data.txt: Это команда, выполняемая внутри контейнера. Она использует cat для отображения содержимого файла data.txt, расположенного в каталоге /app.

Вы должны увидеть "Hello from the container!" выведенное в консоль, что подтверждает, что данные сохранились в томе даже после удаления исходного контейнера.

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

На этом этапе мы научимся удалять неиспользуемые анонимные тома. Анонимные тома создаются, когда вы не явно задаете имя тома при его монтировании в контейнер. Обычно они удаляются при удалении контейнера, который их создал, но иногда они могут сохраняться. Удаление (pruning) помогает очистить эти неиспользуемые тома.

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

docker run --rm -v /data ubuntu ls /data

Разберем эту команду по частям:

  • docker run: Запускает новый контейнер.
  • --rm: Этот флаг автоматически удаляет контейнер при его выходе.
  • -v /data: Это создает анонимный том и монтирует его в каталог /data внутри контейнера. Поскольку мы не указали имя перед двоеточием, Docker генерирует случайное имя для тома.
  • ubuntu: Использует образ ubuntu.
  • ls /data: Команда, выполняемая внутри контейнера, которая выводит список содержимого каталога /data.

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

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

docker volume ls

Вы должны увидеть myvolume и labeled_volume из предыдущих этапов, а также, возможно, один или несколько томов с длинными, случайно выглядящими именами. Это анонимные тома.

Теперь удалим неиспользуемые анонимные тома с помощью команды docker volume prune. По умолчанию эта команда удаляет только анонимные тома, которые в данный момент не используются ни одним контейнером.

docker volume prune

Docker попросит подтверждения перед выполнением операции. Введите y и нажмите Enter.

В выводе будет показано, какие тома были удалены. Вы должны увидеть, что анонимный(ые) том(а) не в использовании были удалены.

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

docker volume ls

Теперь в списке должны быть только именованные тома (myvolume и labeled_volume).

Удаление всех неиспользуемых томов, включая именованные

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

Сначала выведем список существующих томов, чтобы увидеть, что у нас есть.

docker volume ls

Вы должны увидеть в списке myvolume и labeled_volume. Это именованные тома, и они не были удалены командой docker volume prune по умолчанию, так как они имеют имена.

Для удаления всех неиспользуемых томов, включая именованные, нам нужно использовать флаг --all или -a с командой docker volume prune.

docker volume prune --all

Docker снова попросит подтверждения. Введите y и нажмите Enter.

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

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

docker volume ls

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

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

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

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

docker volume create --label env=dev dev_volume
docker volume create --label env=prod prod_volume
docker volume create --label type=data data_volume

Мы создали три новых тома: dev_volume с меткой env=dev, prod_volume с меткой env=prod и data_volume с меткой type=data.

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

docker volume ls

В списке должны быть dev_volume, prod_volume и data_volume.

Теперь удалим только те тома, которые имеют метку env=dev. Мы можем использовать флаг --filter с ключом label.

docker volume prune --filter label=env=dev

Docker попросит подтверждения. Введите y и нажмите Enter.

В выводе будет показано, что dev_volume был удален.

Повторим список томов, чтобы убедиться, что был удален только dev_volume.

docker volume ls

Теперь должны остаться prod_volume и data_volume.

Мы также можем фильтровать по отсутствующим меткам. Например, удалим тома, которые не имеют метку type=data.

docker volume prune --filter label!=type=data

Docker попросит подтверждения. Введите y и нажмите Enter.

В выводе будет показано, что prod_volume был удален.

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

docker volume ls

Теперь должен остаться только data_volume.

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

Резюме

В этом практическом занятии (lab) мы научились управлять томами Docker (Docker volumes), которые являются предпочтительным способом сохранения данных контейнеров. Мы начали с создания и проверки как именованных томов, так и томов с метками (labels) с использованием команд docker volume create и docker volume inspect. Это позволило нам понять, как создаются тома и просмотреть их детали, включая точки монтирования и связанные метки.

Затем мы продемонстрировали сохранность данных, создав контейнер, использующий именованный том, и затем удалив этот контейнер. Это показало, что том и его данные остаются нетронутыми после удаления контейнера. Наконец, мы изучили команду docker volume prune, научились удалять по умолчанию неиспользуемые анонимные тома, удалять все неиспользуемые тома (включая именованные) с использованием флага --all и выборочно удалять тома на основе меток с использованием опции --filter. Эти шаги дали практический опыт по очистке неиспользуемых томов для освобождения дискового пространства.