Назад в блог

Обмен данными между контейнерами Docker

Обмен данными между контейнерами Docker

Введение

Docker — это контейнерная платформа, представляющая собой легкую, виртуализированную, портативную, программно-определяемую стандартизированную среду, которая позволяет программному обеспечению работать изолированно от другого ПО, запущенного на физическом хосте. Docker является определяющим компонентом непрерывной разработки и интеграции (CI/CD) в разработке ПО. Обеспечивая согласованную среду выполнения, Docker гарантирует, что программное обеспечение ведет себя одинаково независимо от физического хоста, на котором оно развернуто. Для подробного обзора экосистемы Docker ознакомьтесь с этой статьей.

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

Предварительные требования

Обратите внимание, что хотя мы работаем с Ubuntu 20.04, инструкции и команды для Docker будут работать в любой другой операционной системе с установленным Docker и пользователем sudo, добавленным в группу docker, как описано в предварительных требованиях выше.

Шаг 1. Создание независимых томов Docker

Мы начнем с создания независимых томов, которые не связаны ни с одним контейнером Docker. Для этого используется команда docker volume create, которая появилась в Docker версии 1.9. Введите следующую команду, чтобы создать том с именем Step1DataVolume :

Вы должны увидеть следующий вывод, указывающий на успешное создание тома:

Docker Volume Create

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

В этой команде флаг --rm автоматически удалит контейнер после выхода. Флаг -v используется для указания и монтирования тома. Флаг -v принимает имя тома, двоеточие и абсолютный путь внутри контейнера, где должен появиться том. Имейте в виду, что при выполнении команды, если указанные в пути каталоги не существуют, они будут созданы. Если они уже существуют, смонтированный том скроет существующее содержимое. Что касается флага -ti, то -t дает доступ к терминалу, а -i позволяет нам взаимодействовать с контейнером через терминал.

Находясь внутри контейнера, выполните следующую команду, чтобы записать некоторые данные в том:

Введите exit и нажмите enter чтобы выйти из контейнера. Как уже объяснялось, контейнер автоматически удаляется при выходе благодаря флагу --rm, однако том все равно останется доступным.

Чтобы убедиться, что том все еще существует, вы можете использовать команду docker volume inspect:

Вы должны увидеть следующий вывод:

Docker Volume Inspect

Далее давайте создадим новый контейнер. Сначала подключим том и проверим, сможем ли мы получить доступ к тексту, созданному в предыдущем контейнере. Введите следующую команду, чтобы создать и запустить контейнер с использованием ubuntu образ:

Внутри контейнера выполните следующую команду, чтобы убедиться, что файл StepOne.txt существует:

Вы должны увидеть похожий вывод:

Docker Volume Content 1

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

Шаг 2. Создание тома Docker, который сохраняет данные при удалении контейнера

На этом шаге мы будем использовать одну команду для создания тома одновременно с созданием контейнера. Затем мы удалим контейнер и подключим этот том к новому контейнеру. Эта команда похожа на ту, которая использовалась на Шаге 1, однако мы добавляем один флаг --name, чтобы указать имя контейнера:

Находясь внутри контейнера, введите следующую команду, чтобы записать данные в том и убедиться, что они там есть:

Ниже приведен вывод трех команд:

Persistent Docker Volume

Затем выйдите из контейнера. При перезапуске контейнера с помощью следующей команды том подключится автоматически:

Внутри контейнера убедитесь, что том смонтирован, проверив существование файла StepTwo.txt с помощью команды:

Вот вывод:

Docker Volume After Restart

Теперь вы можете выйти из контейнера. Docker предотвращает удаление тома, на который ссылается другой контейнер. Вы можете попробовать удалить том с помощью команды:

В выводе вы должны увидеть сообщение об ошибке:

Error Response

Давайте удалим контейнер, используя идентификатор контейнера (container id), показанный в выводе, с помощью команды docker rm :

Замените выделенный container id на id вашего контейнера, показанный в терминале. Команда удаляет контейнер, но не удаляет созданный нами том. Вы можете просмотреть список доступных томов с помощью команды docker volume ls , чтобы проверить:

Вот вывод:

Docker Volume List

Чтобы удалить контейнер, созданный на Шаге 2, введите следующую команду:

На этом шаге вы смогли создать том Docker одновременно с созданием контейнера. Давайте посмотрим, как можно создать том из существующего каталога с данными.

Шаг 3. Создание тома Docker из существующего каталога с данными

Если вы хотите скопировать данные в том, вы можете создать том во время создания контейнера и указать путь к каталогу, содержащему данные в базовом образе. В приведенной ниже команде мы создаем контейнер и добавляем том данных в /var, который является каталогом, содержащим данные в базовом образе:

При запуске команды содержимое каталога /var базового образа будет скопировано в том. Этот том можно подключить к новому контейнеру. Затем выйдите из контейнера:

Create Docker Volume

Введите следующую команду, чтобы создать контейнер, подключить том и вывести список содержимого тома с помощью команды ls :

Вы должны увидеть аналогичный вывод команды, который представляет собой копию содержимого каталога /var базового образа, теперь доступного в Step3DataVolume:

Copy Docker Volume

Хотя монтирование /var каталога, как мы делали в этом примере, может быть непрактичным, это помогает понять, что вы можете смонтировать любой каталог, созданный в ваших пользовательских образах, в том Docker, чтобы сделать данные доступными для других контейнеров.

Шаг 4. Совместное использование данных несколькими контейнерами Docker

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

  • Создайте Step4Container1 и Step4DataVolume

Используйте команду docker run с флагом --name для создания именованного контейнера:

Внутри контейнера выполните следующую команду, чтобы создать текстовый файл и добавить в него текст:

После этого выйдите из контейнера и вернитесь в хост-среду. Теперь мы хотим создать еще один контейнер и смонтировать в него тома из Step4Container1 в него.

  • Создайте Step4Container2 и подключите тома из контейнера Step4Container1

Выполните следующую команду, чтобы создать Step4Container2 и смонтировать тома из Step4Container1:

Внутри контейнера используйте команду cat для проверки сохранности данных:

Вы должны увидеть следующий вывод:

Container Data Sharing

Мы можем добавить еще немного текста в файл из Step4Container2 , введя следующую команду:

После этого выйдите из контейнера, и мы вернемся в Step4Container1 , чтобы проверить, сохранились ли данные.

  • Проверка изменений, внесенных в том Docker, между различными контейнерами

Чтобы просмотреть изменения, сначала перезапустите Step4Container1 с помощью команды:

Проверьте изменения с помощью команды:

Вы должны увидеть вывод, аналогичный скриншоту ниже:

Copied Container Data

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

  • Монтирование тома в контейнер Docker в режиме «только для чтения»

В этом примере мы создадим контейнер с именем Step4Container3. В команде создания мы монтируем тома из Step4Container1 и добавляем :ro , чтобы указать, что этот контейнер имеет доступ только для чтения, но не может выполнять запись в том. Выполните следующую команду в терминале:

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

Read Only Mount

Однако, если вы попытаетесь удалить файл с помощью команды:

В терминале появится сообщение об ошибке следующего вида:

Read Only Error

После проверки прав на чтение и запись вы можете выйти из контейнера. Если вы хотите удалить контейнеры и том, созданные в этом руководстве, выполните следующие команды:

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

Заключение

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

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

Приятной работы!

author

Pranay Kapgate

Автор · CloudSigma

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

Комментарии

Комментариев пока нет. Будьте первым.