Введение
В этом лабораторном занятии (LabEx) вы научитесь эффективно управлять томами Docker, сконцентрировавшись на команде docker volume prune. Мы начнем с создания и изучения различных типов томов, включая именованные тома и тома с метками (labels), чтобы понять их свойства и то, как Docker управляет ими.
После этого мы покажем, как тома используются с контейнерами, создав и затем удалив контейнер, который использует том. Это продемонстрирует сохранность данных, хранящихся в томах. Наконец, в рамках лабораторного занятия (LabEx) вы научитесь использовать команду docker volume prune для удаления неиспользуемых томов, в том числе анонимных томов, всех неиспользуемых томов (включая именованные тома), а также применять фильтры меток (labels) для выборочного удаления томов.
Создание и проверка некоторых томов
На этом этапе мы научимся создавать и изучать тома 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). Это мощный способ выборочно удалять тома, соответствующие определенным критериям, не затрагивая другие тома.
Сначала создадим несколько новых томов с разными метками, чтобы иметь что фильтровать.
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. Эти шаги дали практический опыт по очистке неиспользуемых томов для освобождения дискового пространства.



