Найти тему
Timeweb Cloud

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

Оглавление
📜Читайте также: Защита контейнеризации: обеспечиваем безопасность Docker и Kubernetes

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

Чтобы избежать потери содержимого контейнера в случае, если он будет удален, был разработан специальный инструмент Docker volumes. Именно о нем этот материал.

Процесс записи данных в контейнер

Мы рассмотрим, что именно происходит с данными в процессе записи в контейнер.

Чтобы загрузить в контейнер содержимое, необходимо выполнить команды в такой же последовательности:

  • docker run -it --rm busybox (вход в оболочку контейнера);
  • echo "Timeweb Cloud" > /tmp/data (запись данных)
    cat /tmp/data
    Timeweb Cloud

После выполнения второй команды можно наблюдать, что данные записываются. Только вопрос «куда» остается открытым. Кто работал с Докер, тот знает устройство контейнера. Если кратко, то он запускается из образа, в основе которого слои. Эти слои накладываются друг на друга и принадлежат образу. Только завершающий слой принадлежит контейнеру. Здесь нужно упомянуть про такой важный нюанс, что каждый из этих слоев доступен исключительно для чтения. Однако есть исключения для слоев, которые принадлежат контейнеру. Помимо чтения, они доступны и для записи. Все измененные данные попадают именно в этот завершающий слой.

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

Хранилище для контейнеров

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

Об устройстве томов

На серверном компьютере создается директория. Затем она монтируется в один или несколько контейнеров. При этом сама директория остается независимой, поскольку не входит в структуру слоев. Именно это позволяет обойти ограничение «только для чтения». В итоге в контейнере том будет отображаться в виде каталога. Этой теории достаточно, чтобы перейти к практике.

Инструкция: создание тома

Первый способ. Сейчас можете попробовать создать том и затем узнать его местоположение при помощи второй команды:

docker volume create

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

Вместо значения тома будут десятки цифр и букв. После запуска инструкции появится информация о времени создания и Mountpoint (путь до тома). Для просмотра содержимого тома достаточно открыть нужный каталог.

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

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

Разберем синтаксис команды. После имени тома необходимо ставить двоеточие. После двоеточия необходимо поставить слэш и через него указать путь монтирования тома в контейнере. Кстати, про название тома. Мы выбрали newfile). Можно присваивать абсолютно любые имена. Главное, чтобы они не повторялись.

И затем при помощи команды, которую показывали в начале, записываем данные в контейнер:

echo "Timeweb" > /data/timeweb

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

Теперь проверим, что у нас получилось. Для этого понадобится ввести инструкцию:

docker volume ls

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

Заключительное тестирование:

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

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

Как использовать Docker Volumes

Давайте разберем типовую задачу, когда необходимо использовать тома. К примеру, разработчикам нужно создать приложение, которое будет собирать конкретную информацию. В нашем случае это статистика по теннисному турниру. Практически все статистические данные подвергаются дальнейшему анализу. Наши тоже не стали исключением. Затем букмекерские компании могут использовать эту информацию для прогнозов и ставок. Назовем приложение TennisStatistics. И посмотрим, с какими задачами поможет справиться Docker Volumes.

  1. Сохранение данных

Как вам уже известно, если не использовать хранилище данных, то вся статистика за определенный период будет исчезать после удаления контейнера. А чтобы этого не произошло, сохраним всю информацию в томах. Сейчас нам нужно воспользоваться инструкцией, о которой мы писали выше вместе с аргументом -v. Это выглядит следующим образом:

-v tennisstatistics:/dir/tennisstatistics

Данные будут храниться в директории tennisstatistics, которая находится поверх всех слоев.

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

Предположим, что у нас накопилось достаточно данных, которые можно проанализировать. В случае с нашим примером мы можем узнать результат или продолжительность турнира, проанализировать игру отдельных теннисистов. Как раз таки здесь мы можем применить решение от Докер. Нам необходимо монтировать том в новый контейнер, например, назовем его tennisstatisticsAnalytics. После чего он продолжит считывать данные, не мешая при этом сбору данных в tennisstatistics.

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

Для хранения информации можно использовать существующий том или создать новый.

Типы монтирования

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

  1. Bind Mount или монтирование директории с хоста. Тома mount создаются с целью добавить в контейнер имеющийся путь. Это облегчает добавление конфигурационной информации, наборов данных и статистики с сайтов. При помощи совместного использования команды <host path>:<container path> и инструкции --mount, указываются директории, которые необходимо монтировать в контейнер.
  2. Tempfs Mount. Тома докер создаются с целью предотвратить потерю информации при исчезновении контейнера. А тома Tempfs реализуют обратную функцию. Они используются для отмены автоматического сохранения информации после удаления контейнера. Но тем не менее том данного типа тоже активно используется разработчиками, у которых большое количество одноразовых записей. Если ими перегружать систему, то значительно снижается ее производительность.

Чтобы создать временную директорию необходимо воспользоваться инструкцией --tempfs.

Драйверы для управления томами

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

В завершении

Если вы также работаете с контейнерами, то тома докер станут незаменимым инструментом. Они создаются с помощью простых инструкций, но позволяют забыть про безвозвратное исчезновение ценной информации. Еще больше информации можно найти на официальном сайте.

Кстати, в официальном канале Timeweb Cloud собрали комьюнити из специалистов, которые говорят про IT-тренды, делятся полезными инструкциями и даже приглашают к себе работать.💥