Бесплатная миграция IT-инфраструктуры в облако

Хранилище Docker-контейнеров

Роман Андреев
Роман Андреев
Технический писатель
29 декабря 2022 г.
7990
7 минут чтения
Средний рейтинг статьи: 3

У контейнеризации Docker много плюсов, и очень полезными являются слои образов. Они обеспечивают высокую скорость генерации контейнеров. Тем не менее у контейнеров есть и свои слабые места: например, необходимость планирования при хранении постоянных данных, поскольку с уничтожением контейнера уничтожается и вся информация внутри. В этой статье мы расскажем о том, как избежать этой проблемы, используя фирменное решение под названием Docker Volumes, которое создает хранилище образов Docker.

Что происходит с данными после записи в контейнер

Для начала давайте зайдем во внутреннюю оболочку контейнера, сделать это можно при помощи инструкции: 

docker run -it --rm busybox 

Теперь попробуем записать в контейнер некоторые данные, вот так:

echo "Timeweb Cloud" > /tmp/data
cat /tmp/data
Timeweb Cloud

Видно, что запись данных ведется, однако неясно, куда именно. Если вы уже немного знакомы с Docker, то наверняка знаете, что образы представляют собой своеобразную луковичную структуру: слои в них записываются один на другой, и последний слой финализирует образ. В результате в каждый слой информация может быть занесена только однократно, а затем он уже является read only, то есть доступен только для чтения. Но при создании контейнера программа создает еще один слой, который отвечает за вызовы записей различных слоев.

Срок жизни контейнеров ограничен. Соответственно, все записанные данные также исчезают с исчезновением контейнера. Это заставляет задуматься в случае, если содержащаяся в контейнере информация представляет определенную ценность для разработчиков приложений. И чтобы эти данные не пропали, создатели платформы придумали собственное решение для этих целей: Docker Volumes или «тома Docker». Рассмотрим его подробнее и приведем примеры полезных команд.

Docker Volumes

Docker Volumes предоставляет разработчикам постоянное хранилище для контейнеров. Этот инструмент отключает привязку данных к жизненному циклу контейнера, позволяя получить доступ к контейнерным данным в любой момент. Таким образом, сделанные в контейнерах записи остаются доступными после уничтожения содержавшего их контейнера и могут повторно использоваться в других. Это полезное решение для обмена данными между контейнерами Docker, которое также дает возможность подключения новых контейнеров к созданному хранилищу.

Docker Volumes устроен следующим образом: на сервере создается каталог, которые затем монтируется в один или несколько контейнеров. При этом каталог является независимым, поскольку не включается в структуру слоев образа Docker. Это и позволяет обойти ограничение read only для создаваемых контейнеров с таким каталогом внутри.

Для создания тома (Volume) введите следующую инструкцию: 

docker volume create 

Теперь давайте проверим его местонахождение при помощи инструкции: 

docker volume inspect значение_тома

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

Впрочем, есть и другие способы создания нового Docker Volume. Например, команда -v, добавленная в инструкцию, позволяет создать его прямо в процессе, то есть на лету, вот так: 

docker run -it --rm -v newdata:/data busybox

Давайте расшифруем, что здесь происходит.

Аргумент -v имеет собственный синтаксис, что видно по двоеточию, которое ставится сразу же после имени тома (мы выбрали для него очень оригинальное название newdata). А далее через слэш указывается путь монтирования тома в контейнере. Теперь можно записывать туда данные, например: 

echo "Timeweb" > /data/timeweb

Записанные таким образом данные нетрудно найти по пути монтирования.

Как видно из примера выше, название тома отнюдь не случайно, а совпадает с тем, которое мы ввели, используя -v. Однако Docker Volumes позволяет задавать и рандомные имена, которые всегда будут уникальными для отдельного хоста. При создании имени вручную следует обращать на это внимание и следить, чтобы задаваемые имена тоже были уникальны.

Теперь введем инструкцию:

docker volume ls

Успешный вывод означает, что данный том может быть использован с любым количеством других контейнеров. Для проверки можно ввести, например, следующее: 

docker run -it --rm -v newdata:/data busybox

А затем напечатать что-то и записать на том. Далее запускаем еще один контейнер точно такой же инструкцией и видим, что введенные данные остались доступны, то есть их можно использовать снова.

Docker Volumes на практике

Теперь давайте рассмотрим, как можно использовать Docker Volumes в практических целях. Допустим, мы работаем над созданием приложения по сбору определенной информации: пусть это будет футбольная статистика. Мы собираем ее, а затем планируем использовать для дальнейшего анализа: например, для оценки трансферной стоимости футболистов или для букмекерских прогнозов. Пусть наше приложение называется FootballStats.

Сохранение данных после уничтожения контейнера

Понятно, что если мы не будем использовать инструменты Docker Volumes, то вся собранная статистика будет просто пропадать сразу после уничтожения контейнера, ее содержащего. А значит, нам понадобится сохранять данные в томах, чтобы затем использовать их в дальнейшей работе. Для этого вводим уже знакомую инструкцию, используя аргумент -v

-v footballstats:/dir/footballstats

Это позволит нам хранить статистику матчей в каталоге /dir/footballstats поверх всех слоев контейнера.

Совместное использование данных

Допустим, в контейнере FootballStats уже собрано определенное количество информации, которую настало время подвергнуть анализу. Например, мы хотим выяснить, как выступала та или иная команда в последнем чемпионате страны или как играл определенный футболист (выходы в основном составе, голы, пасы, карточки и т. д.). Для этого, используя Docker Volumes, просто монтируем наш том в новый контейнер, который назовем, скажем, FootballStats-Analytics. Его особенность в том, что он позволяет продолжать считывание данных, не препятствуя их сбору контейнером FootballStats. А параллельно будет выполняться анализ поступающей информации по заданным параметрам и алгоритмам. Причем храниться эта информация может где угодно: как в существующем, так и в новом томе, если возникнет такая необходимость.

Другие типы монтирования

Помимо стандартных томов при помощи Docker Volumes можно также создавать тома следующих типов, предназначенные для решения специальных задач:

  • Bind Mount. Тома mount предназначены для добавления в контейнер имеющегося пути. Это помогает для добавления конфигурационной информации, а также наборов данных и статики с сайтов. Чтобы указать каталоги, предназначенные для монтирования в контейнер, нужно использовать инструкцию --mount совместно с <host path>:<container path>.
  • Tempfs Mount. Тома tempfs выполняют функцию, обратную главной задаче Docker Volumes, то есть они отменяют сохранение информации после ликвидации контейнера. Это может понадобиться тем разработчикам, которые ведут достаточно обширное журналирование. В таком случае постоянные одноразовые записи могут привести к серьезному падению производительности системы. Инструкции --tempfs создают временные директории для записи непосредственно в памяти, чтобы исключить постоянные обращения к файловой системе.

Драйверы

Драйверы томов Docker — полезный инструмент, обеспечивающий гибкое управление томами, так как с их помощью указываются параметры хранения. Важнейшим параметром является место хранения, которое может быть любым, в том числе и удаленным, то есть за пределами собственной физической или виртуальной инфраструктуры провайдера. Это поможет сохранить информацию не только после уничтожения контейнера, но и после ликвидации самого хоста.

Итоги

Итак, мы выяснили, как создавать и управлять хранилищем с помощью инструмента Docker Volumes. Дополнительная информация о том, как изменить хранилище контейнеров Docker, представлена в документации самой платформы. Ознакомиться с официальной документацией по этой теме (на английском языке) можно здесь.

29 декабря 2022 г.
7990
7 минут чтения
Средний рейтинг статьи: 3
Пока нет комментариев