Создать локальный том с параметрами монтирования
На этом этапе вы узнаете, как создать локальный том 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