- PVSM.RU - https://www.pvsm.ru -
В сегодняшней части перевода серии материалов о Docker мы поговорим о работе с данными. В частности — о томах Docker. В этих материалах мы постоянно сравнивали программные механизмы Docker с разными съедобными аналогиями. Не будем отходить от этой традиции и здесь. Данные в Docker пусть будут специями. В мире существует множество видов специй, а в Docker — множество способов работы с данными.
→ Часть 1: основы [1]
→ Часть 2: термины и концепции [2]
→ Часть 3: файлы Dockerfile [3]
→ Часть 4: уменьшение размеров образов и ускорение их сборки [4]
→ Часть 5: команды [5]
Обратите внимание на то, что этот материал подготовлен с использованием движка Docker версии 18.09.1 и API версии 1.39 [6].
Данные в Docker могут храниться либо временно, либо постоянно. Начнём с временных данных.
В контейнерах Docker организовать работу с временными данными можно двумя способами.
По умолчанию файлы, создаваемые приложением, работающим в контейнере, сохраняются в слое контейнера, поддерживающем запись. Для того чтобы этот механизм работал, ничего специально настраивать не нужно. Получается дёшево и сердито. Приложению достаточно просто сохранить данные и продолжить заниматься своими делами. Однако после того как контейнер перестанет существовать, исчезнут и данные, сохранённые таким вот нехитрым способом.
Для хранения временных файлов в Docker можно воспользоваться ещё одним решением, подходящим для тех случаев, когда требуется более высокий уровень производительности, в сравнении с тем, который достижим при использовании стандартного механизма временного хранения данных. Если вам не нужно, чтобы ваши данные хранились бы дольше, чем существует контейнер, вы можете подключить к контейнеру tmpfs — временное хранилище информации, которое использует оперативную память хоста. Это позволит ускорить выполнение операций по записи и чтению данных.
Часто бывает так, что данные нужно хранить и после того, как контейнер прекратит существовать. Для этого нам пригодятся механизмы постоянного хранения данных.
Существуют два способа, позволяющих сделать срок жизни данных большим срока жизни контейнера. Один из способов заключается в использовании технологии bind mount. При таком подходе к контейнеру можно примонтировать, например, реально существующую папку. Работать с данными, хранящимися в такой папке, смогут и процессы, находящиеся за пределами Docker. Вот как выглядят [7] монтирование tmpfs и технология bind mount.
Монтирование tmpfs и bind mount
Минусы использования технологии bind mount заключаются в том, что её использование усложняет резервное копирование данных, миграцию данных, совместное использование данных несколькими контейнерами. Гораздо лучше для постоянного хранения данных использовать тома Docker.
Том — это файловая система, которая расположена на хост-машине за пределами контейнеров. Созданием и управлением томами занимается Docker. Вот основные свойства томов Docker:
Как видите, тома Docker обладают замечательными свойствами. Давайте поговорим о том, как их создавать.
Тома можно создавать средствами Docker или с помощью запросов к API.
Вот инструкция в Dockerfile, которая позволяет создать том при запуске контейнера.
VOLUME /my_volume
При использовании подобной инструкции Docker, после создания контейнера, создаст том, содержащий данные, которые уже имеются в указанном месте. Обратите внимание на то, что если вы создаёте том с использованием Dockerfile, это не освобождает вас от необходимости указать точку монтирования тома.
Создавать тома в Dockerfile можно и используя формат JSON.
Кроме того, тома можно создавать средствами командной строки во время работы контейнера.
Создать самостоятельный том можно следующей командой:
docker volume create —-name my_volume
Для того чтобы просмотреть список томов Docker, воспользуйтесь следующей командой:
docker volume ls
Исследовать конкретный том можно так:
docker volume inspect my_volume
Удалить том можно так:
docker volume rm my_volume
Для того чтобы удалить все тома, которые не используются контейнерами, можно прибегнуть к такой команде:
docker volume prune
Перед удалением томов Docker запросит у вас подтверждение выполнения этой операции.
Если том связан с каким-либо контейнером, такой том нельзя удалить до тех пор, пока не удалён соответствующий контейнер. При этом, даже если контейнер удалён, Docker не всегда это понимает. Если это случилось — можете воспользоваться следующей командой:
docker system prune
Она предназначена для очистки ресурсов Docker. После выполнения этой команды у вас должна появиться возможность удалить тома, статус которых до этого определялся неправильно.
Для работы с томами вам, при вызове команды docker
, часто придётся пользоваться флагами. Например, для того чтобы создать том во время создания контейнера можно воспользоваться такой конструкцией:
docker container run --mount source=my_volume, target=/container/path/for/volume my_image
В давние времена (до 2017 года) популярен был флаг --volume
. Изначально этот флаг (ещё им можно пользоваться в сокращённом виде, тогда он выглядит как -v
) использовался для самостоятельных контейнеров, а флаг --mount
— в среде Docker Swarm. Однако, начиная с Docker 17.06, флаг --mount
можно использовать в любых сценариях.
Надо отметить, что при использовании флага --mount
увеличивается объём дополнительных данных, которые приходится указывать в команде, но, по нескольким причинам, лучше использовать именно этот флаг, а не --volume
. Флаг --mount
— это единственный механизм, который позволяет работать с сервисами или указывать параметры драйвера тома. Кроме того, работать с этим флагом проще.
В существующих примерах команд, направленных на работу с данными в Docker, вы можете встретить множество примеров употребления флага -v
. Пытаясь адаптировать эти команды для себя, учитывайте то, что флаги --mount
и --volume
используют различные форматы параметров. То есть, нельзя просто заменить -v
на --mount
и получить рабочую команду.
Главное различие между --mount
и --volume
заключается в том, что при использовании флага --volume
все параметры собирают вместе, в одном поле, а при использовании --mount
параметры разделяются.
При работе с --mount
параметры представлены как пары вида ключ-значение, а именно, это выглядит как key=value
. Эти пары разделяют запятыми. Вот часто используемые параметры --mount
:
type
— тип монтирования. Значением для соответствующего ключа могут выступать bind [8], volume [7] или tmpfs [9]. Мы тут говорим о томах, то есть — нас интересует значение volume
.source
— источник монтирования. Для именованных томов это — имя тома. Для неименованных томов этот ключ не указывают. Он может быть сокращён до src
.destination
— путь, к которому файл или папка монтируется в контейнере. Этот ключ может быть сокращён до dst
или target
.readonly
— монтирует том, который предназначен только для чтения [10]. Использовать этот ключ необязательно, значение ему не назначают.
Вот пример использования --mount
с множеством параметров:
docker run --mount type=volume,source=volume_name,destination=/path/in/container,readonly my_image
Вот полезные команды, которыми можно пользоваться при работе с томами Docker:
docker volume create
docker volume ls
docker volume inspect
docker volume rm
docker volume prune
Вот список часто используемых параметров для --mount
, применимых в команде вида docker run --mount my_options my_image
:
type=volume
source=volume_name
destination=/path/in/container
readonly
Теперь, когда мы завершили эту серию материалов о Docker, пришло время сказать пару слов о том, куда тем, кто изучает Docker, можно двигаться дальше. Вот [11] большая хорошая статья о Docker. Вот [12] книга о Docker (покупая эту книгу, постарайтесь раздобыть самое свежее её издание). Вот [13] ещё одна книга, которая подойдёт тем, кто полагает, что практика — это лучший способ изучения технологий.
Уважаемые читатели! Какие материалы о Docker вы посоветовали бы изучить новичкам?
Автор: ru_vds
Источник [14]
Сайт-источник PVSM.RU: https://www.pvsm.ru
Путь до страницы источника: https://www.pvsm.ru/razrabotka/310158
Ссылки в тексте:
[1] Часть 1: основы: https://habr.com/post/438796/
[2] Часть 2: термины и концепции: https://habr.com/post/439978/
[3] Часть 3: файлы Dockerfile: https://habr.com/post/439980/
[4] Часть 4: уменьшение размеров образов и ускорение их сборки: https://habr.com/post/440658/
[5] Часть 5: команды: https://habr.com/post/440660/
[6] 1.39: https://docs.docker.com/engine/api/version-history/
[7] выглядят: https://docs.docker.com/storage/volumes/
[8] bind: https://docs.docker.com/storage/bind-mounts/
[9] tmpfs: https://docs.docker.com/storage/tmpfs/
[10] только для чтения: https://docs.docker.com/storage/volumes/#use-a-read-only-volume
[11] Вот: https://medium.freecodecamp.org/a-beginner-friendly-introduction-to-containers-vms-and-docker-79a9e3e119b
[12] Вот: https://www.amazon.com/Docker-Deep-Dive-Nigel-Poulton-ebook/dp/B01LXWQUFF
[13] Вот: https://dockerbook.com/
[14] Источник: https://habr.com/ru/post/441574/?utm_campaign=441574
Нажмите здесь для печати.