Введение
Эта статья объясняет, как управлять данными в Docker с помощью томов и контейнеров данных. Вы узнаете, как создавать тома с использованием флага -v, монтировать каталоги хоста, совместно использовать данные между контейнерами с помощью --volumes-from, а также как удалять тома. Примеры демонстрируют работу с контейнерами debian и postgres.
Что такое тома в Docker
Тома (volumes) в Docker — это каталоги или файлы, которые не входят в файловую систему UnionFS контейнера, а представляют собой обычные каталоги в файловой системе хоста. Они могут быть смонтированы как отдельные файловые системы (bind mounting) внутри контейнера, обеспечивая хранение данных, независимых от жизненного цикла контейнера.
Способы создания томов
Существует три способа инициализации томов:
- Объявление тома в
Dockerfileс помощью инструкцииVOLUME. Тома, указанные вDockerfile, создаются автоматически при запуске контейнера. - Создание тома с помощью флага
-vв командеdocker run. Пример:
$ docker run -it --name container-test -h CONTAINER -v /data debian /bin/bash
root@CONTAINER:/# ls /data
Здесь каталог /data внутри контейнера становится томом. Файлы из образа, находившиеся в /data, копируются в том. Проверить расположение тома на хосте можно с помощью:
$ docker inspect -f {{.Mounts}} container-test
[{5cad... /mnt/sda1/var/lib/docker/volumes/5cad.../_data /data local true}]
Том находится в /var/lib/docker/volumes/5cad.../_data. Добавление файла на хосте подтверждает связь:
$ sudo touch /var/lib/docker/volumes/5cad.../_data/test-file
root@CONTAINER:/# ls /data
test-file
- Монтирование каталога хоста с помощью
-v HOST_DIR:CONTAINER_DIR. Этот способ явно указывает каталог хоста. Пример:
$ docker run -v /home/adrian/data:/data debian ls /data
Каталог /home/adrian/data хоста монтируется как /data в контейнере. Содержимое /data из образа скрывается, и файлы не копируются в том. Этот том не удаляется командой docker rm -v.
Примечание: Использование -v HOST_DIR:CONTAINER_DIR называется монтированием каталогов как файловых систем (bind mounting). Оно не применимо в Dockerfile из-за вопросов переносимости и безопасности.
Совместное использование данных
Для совместного использования данных между контейнерами используйте флаг --volumes-from. Пример:
$ docker run -it -h NEWCONTAINER --volumes-from container-test debian /bin/bash
root@NEWCONTAINER:/# ls /data
test-file
Новый контейнер получает доступ к томам контейнера container-test, включая каталог /data.
Контейнеры данных создаются для упрощения совместного использования томов. Пример с postgres:
$ docker run --name dbdata postgres echo "Data-only container for postgres"
Контейнер dbdata инициализирует тома, определённые в образе postgres. Затем тома можно использовать в другом контейнере:
$ docker run -d --volumes-from dbdata --name db1 postgres
Совет: Для контейнеров данных используйте тот же образ, что и для рабочих контейнеров (например, postgres), чтобы обеспечить корректные права доступа и избежать лишних загрузок. Контейнеры данных не нужно держать активными, так как это расходует ресурсы.
Удаление томов
Тома удаляются только при выполнении следующих условий:
- Контейнер удалён с помощью
docker rm -vили использован флаг--rmвdocker run. - Нет других контейнеров, использующих эти тома.
- Том не связан с каталогом хоста (не использовался
-v HOST_DIR:CONTAINER_DIR).
Внимание: Без осторожного управления тома могут остаться «сиротами» в каталоге /var/lib/docker/volumes.
Заключение
Тома и контейнеры данных в Docker обеспечивают гибкое управление данными, позволяя хранить файлы вне UnionFS и совместно использовать их между контейнерами. Использование флагов -v и --volumes-from упрощает работу с данными, но требует внимательности при удалении томов, чтобы избежать «сирот».
Отзывы