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

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

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

Введение

В этом лабораторном занятии вы узнаете, как эффективно управлять сохранением данных в Docker с помощью команды docker volume create. Мы рассмотрим фундаментальный процесс создания базовых томов (volumes), которые являются предпочтительным способом хранения данных контейнеров из-за их управления Docker и простоты резервного копирования/миграции по сравнению с привязанными монтированиями (bind mounts).

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


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/ContainerOperationsGroup -.-> docker/exec("Execute Command in Container") docker/ContainerOperationsGroup -.-> docker/inspect("Inspect Container") docker/ContainerOperationsGroup -.-> docker/create("Create Container") docker/ImageOperationsGroup -.-> docker/pull("Pull Image from Repository") docker/VolumeOperationsGroup -.-> docker/volume("Manage Volumes") subgraph Lab Skills docker/exec -.-> lab-555258{{"Как использовать команду docker volume create для управления данными"}} docker/inspect -.-> lab-555258{{"Как использовать команду docker volume create для управления данными"}} docker/create -.-> lab-555258{{"Как использовать команду docker volume create для управления данными"}} docker/pull -.-> lab-555258{{"Как использовать команду docker volume create для управления данными"}} docker/volume -.-> lab-555258{{"Как использовать команду docker volume create для управления данными"}} end

Создание базового тома (volume)

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

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

docker volume create myvolume

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

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

docker volume inspect myvolume

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

Далее запустим контейнер и подключим к нему этот том. Используем образ ubuntu и смонтируем том myvolume в директорию /app внутри контейнера. Также запустим простую команду для записи некоторых данных в файл в смонтированном томе.

Сначала скачайте образ ubuntu, если его нет локально.

docker pull ubuntu

Теперь запустим контейнер и запишем данные в том.

docker run -d --name mycontainer -v myvolume:/app ubuntu bash -c "echo 'Hello from the volume!' > /app/greeting.txt && tail -f /dev/null"

Разберем эту команду:

  • docker run -d: Запускает контейнер в отсоединенном режиме (в фоновом режиме).
  • --name mycontainer: Назначает контейнеру имя mycontainer.
  • -v myvolume:/app: Монтирует том с именем myvolume в директорию /app внутри контейнера.
  • ubuntu: Указывает образ, который нужно использовать.
  • bash -c "echo 'Hello from the volume!' > /app/greeting.txt && tail -f /dev/null": Выполняет команду bash внутри контейнера. Она записывает строку "Hello from the volume!" в файл с именем greeting.txt в директории /app (которая является смонтированным томом), а затем запускает tail -f /dev/null, чтобы контейнер продолжал работать.

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

docker exec mycontainer cat /app/greeting.txt

Вы должны увидеть вывод "Hello from the volume!", что подтверждает, что данные были успешно записаны в том изнутри контейнера.

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

docker stop mycontainer
docker rm mycontainer

Создание тома (volume) с определенным драйвером и параметрами

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

Мы продолжим использовать драйвер local, но покажем, как явно указать его и передать параметры. Драйвер local поддерживает параметры, такие как type, device и o для указания типа файловой системы, устройства для монтирования и параметров монтирования соответственно.

Создадим том с именем myvolume2 с использованием драйвера local и укажем некоторые параметры. В этом примере мы будем использовать тип файловой системы tmpfs, который хранит данные в памяти. Это полезно для временных данных, которые не должны сохраняться при перезапуске хоста.

docker volume create --driver local --opt type=tmpfs --opt device=tmpfs --opt o=size=100m myvolume2

Разберем эту команду:

  • docker volume create: Команда для создания тома.
  • --driver local: Явно указывает драйвер тома local.
  • --opt type=tmpfs: Передает параметр type=tmpfs драйверу, указывая тип файловой системы.
  • --opt device=tmpfs: Передает параметр device=tmpfs драйверу, указывая устройство. Для tmpfs устройство также равно tmpfs.
  • --opt o=size=100m: Передает параметр o=size=100m драйверу. Параметр o используется для передачи параметров монтирования. В этом случае мы устанавливаем максимальный размер тома tmpfs равным 100 мегабайтам.
  • myvolume2: Имя создаваемого тома.

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

Теперь проверим, какой драйвер и параметры были применены для этого тома.

docker volume inspect myvolume2

В выводе вы должны увидеть, что поле Driver установлено в local, а в поле Options перечислены параметры, которые мы указали (type=tmpfs, device=tmpfs, o=size=100m). Поле Mountpoint покажет, где этот том tmpfs смонтирован на хосте.

Далее запустим контейнер и подключим к нему этот новый том. Мы снова будем использовать образ ubuntu и смонтируем том myvolume2 в директорию /data внутри контейнера.

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

docker pull ubuntu

Теперь запустим контейнер и подключим том.

docker run -d --name mycontainer2 -v myvolume2:/data ubuntu tail -f /dev/null

Эта команда запускает контейнер ubuntu с именем mycontainer2 в отсоединенном режиме и монтирует том myvolume2 в /data. Команда tail -f /dev/null позволяет контейнеру оставаться запущенным.

Поскольку myvolume2 - это том tmpfs, любые данные, записанные в /data внутри контейнера, будут храниться в памяти и не сохранятся после остановки и удаления контейнера или при перезапуске хоста.

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

docker stop mycontainer2
docker rm mycontainer2

Том myvolume2 по-прежнему существует, но его содержимое (если оно было записано) пропало, так как это том tmpfs.

Создание локального тома (volume) с параметрами монтирования

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

Мы создадим локальный том с именем myvolume3 и используем параметр o для указания параметров монтирования. В этом примере мы установим параметры uid и gid, чтобы убедиться, что файлы, созданные в томе контейнером, принадлежат определенному пользователю и группе на хосте. Это может быть полезно для управления разрешениями при обмене данными между контейнерами и хостом.

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

mkdir -p ~/project/myvolumedata

Теперь создадим том myvolume3 с использованием драйвера local и укажем параметр o с uid и gid. Мы будем использовать идентификаторы пользователя и группы текущего пользователя labex. Вы можете узнать идентификаторы своего пользователя и группы с помощью команд id -u и id -g.

USER_ID=$(id -u)
GROUP_ID=$(id -g)
docker volume create --driver local --opt type=none --opt device=/home/labex/project/myvolumedata --opt o=bind,uid=$USER_ID,gid=$GROUP_ID myvolume3

Разберем эту команду:

  • docker volume create: Команда для создания тома.
  • --driver local: Указывает драйвер тома local.
  • --opt type=none: Указывает, что не нужно автоматически создавать тип файловой системы. Мы привязываемся к существующей директории.
  • --opt device=/home/labex/project/myvolumedata: Указывает устройство для монтирования, которое представляет собой директорию, которую мы создали на хосте. Обратите внимание на использование абсолютного пути /home/labex/project/myvolumedata.
  • --opt o=bind,uid=$USER_ID,gid=$GROUP_ID: Передает параметры монтирования.
    • bind: Указывает на привязанное монтирование (bind mount), связывающее том с указанным устройством (нашей хост-директорией).
    • uid=$USER_ID: Устанавливает идентификатор пользователя для файлов, созданных в томе, равным идентификатору текущего пользователя.
    • gid=$GROUP_ID: Устанавливает идентификатор группы для файлов, созданных в томе, равным идентификатору группы текущего пользователя.
  • myvolume3: Имя тома.

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

Теперь проверим параметры этого тома.

docker volume inspect myvolume3

В выводе вы должны увидеть, что Driver равен local, а в Options будут указаны type=none, device=/home/labex/project/myvolumedata и o=bind,uid=...,gid=... (с вашими идентификаторами пользователя и группы). Mountpoint будет совпадать с путем device.

Далее запустим контейнер и подключим этот том. Мы будем использовать образ ubuntu и смонтируем том myvolume3 в /app внутри контейнера. Затем создадим файл в директории /app контейнера и проверим его владельца на хосте.

Сначала скачайте образ ubuntu, если это необходимо.

docker pull ubuntu

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

docker run --rm -v myvolume3:/app ubuntu bash -c "echo 'Testing ownership' > /app/testfile.txt && ls -l /app/testfile.txt"

Эта команда запускает контейнер ubuntu, монтирует том myvolume3 в /app, записывает "Testing ownership" в /app/testfile.txt, а затем выводит подробности о файле внутри контейнера. Вы должны увидеть, что файл в контейнере имеет владельца root, так как контейнеры обычно запускаются от имени root по умолчанию.

Теперь проверим владельца файла на хост-машине в директории ~/project/myvolumedata.

ls -l ~/project/myvolumedata/testfile.txt

Вы должны увидеть, что файл testfile.txt на хосте принадлежит пользователю и группе labex благодаря параметрам монтирования uid и gid, которые мы указали при создании тома.

Наконец, удалим созданную директорию.

rm -rf ~/project/myvolumedata

Создание локального тома (volume) с использованием NFS

На этом этапе вы узнаете, как создать локальный том Docker, который использует общий ресурс NFS в качестве бэкенд-хранилища. Это позволяет контейнерам хранить данные на сетевом устройстве хранения, делая эти данные доступными с нескольких хостов и обеспечивая централизованное решение для хранения данных.

Для использования NFS с драйвером тома local необходимо указать адрес сервера NFS и путь к общей директории с помощью параметра device, а тип файловой системы как nfs с помощью параметра type. Также нужно предоставить соответствующие параметры монтирования с помощью параметра o.

В этой лабораторной среде мы будем симулировать общий ресурс NFS, используя адрес петли обратной связи 127.0.0.1 и директорию на хосте. Примечание: В реальном сценарии вы должны заменить 127.0.0.1 на фактический IP-адрес или имя хоста вашего сервера NFS, а /path/to/nfs/share на экспортированный путь на сервере NFS.

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

mkdir -p ~/project/nfs_share

Теперь создадим том myvolume4 с использованием драйвера local с параметрами NFS.

sudo docker volume create --driver local --opt type=nfs --opt device=127.0.0.1:/home/labex/project/nfs_share --opt o=addr=127.0.0.1,rw myvolume4

Разберем эту команду:

  • sudo docker volume create: Мы используем sudo, так как создание томов NFS часто требует привилегий root для выполнения операции монтирования на хосте.
  • --driver local: Указывает драйвер тома local.
  • --opt type=nfs: Указывает тип файловой системы как NFS.
  • --opt device=127.0.0.1:/home/labex/project/nfs_share: Указывает устройство NFS. Это имеет формат nfs_server_address:/exported_path. Мы используем адрес петли обратной связи и директорию, которую мы только что создали. Обратите внимание на использование абсолютного пути /home/labex/project/nfs_share.
  • --opt o=addr=127.0.0.1,rw: Передает параметры монтирования клиенту NFS.
    • addr=127.0.0.1: Указывает адрес сервера NFS.
    • rw: Монтирует общий ресурс с правами чтения и записи.
  • myvolume4: Имя тома.

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

Теперь проверим детали, специфичные для NFS, этого тома.

docker volume inspect myvolume4

В выводе вы должны увидеть, что Driver равен local, а в Options должны быть указаны type=nfs, device=127.0.0.1:/home/labex/project/nfs_share и o=addr=127.0.0.1,rw. Mountpoint покажет, где этот том NFS смонтирован на хосте с помощью Docker.

Далее запустим контейнер и подключим этот том NFS. Мы будем использовать образ ubuntu и смонтируем том myvolume4 в /data внутри контейнера. Затем создадим файл в директории /data контейнера и проверим его наличие на симулированном общем ресурсе NFS хоста.

Сначала скачайте образ ubuntu, если это необходимо.

docker pull ubuntu

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

docker run --rm -v myvolume4:/data ubuntu bash -c "echo 'Data on NFS' > /data/nfs_test.txt && ls -l /data/nfs_test.txt"

Эта команда запускает контейнер ubuntu, монтирует том myvolume4 в /data, записывает "Data on NFS" в /data/nfs_test.txt и выводит подробности о файле внутри контейнера.

Теперь проверим наличие файла на хост-машине в директории ~/project/nfs_share.

ls -l ~/project/nfs_share/nfs_test.txt

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

Наконец, удалим созданную директорию.

rm -rf ~/project/nfs_share

Резюме

В этой лабораторной работе вы узнали, как создавать и управлять томами Docker с помощью команды docker volume create. Вы начали с создания простого тома и изучения его деталей, поняв, как Docker управляет местом хранения данных. Затем вы практиковали подключение этого тома к контейнеру и запись данных в него, показывая, как тома обеспечивают постоянное хранение данных контейнера. В лабораторной работе также рассматривалось создание томов с определенными драйверами и параметрами, включая локальные тома с параметрами монтирования и локальные тома, использующие NFS, демонстрируя гибкость и различные варианты использования томов Docker для различных потребностей в хранении данных.