Как обмениваться данными между контейнерами Docker — CloudSavvy IT

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

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

Программы для Windows, мобильные приложения, игры - ВСЁ БЕСПЛАТНО, в нашем закрытом телеграмм канале - Подписывайтесь:)

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

Использование томов для совместного использования каталога

Объемы — это де-факто способ организовать совместное использование данных. Это независимые файловые системы, которые хранят свои данные вне любого отдельного контейнера. Подключение тома к пути файловой системы в контейнере обеспечивает доступ для чтения и записи к данным тома.

Объемы могут быть прикреплены к нескольким контейнерам одновременно. Это облегчает беспрепятственный обмен данными и постоянство, которым управляет Docker.

Для начала создайте том:

docker volume create —name общие данные

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

docker run -d -v shared-data: / data —name example example-image: latest docker run -d -v shared-data: / backup-source —name backup backup-image: latest

В этом примере контейнер резервного копирования получит эффективный доступ к каталогу контейнера / data этого примера. Он будет смонтирован как / backup-source; изменения, сделанные одним контейнером, будут отражены в другом.

Быстрый запуск контейнеров с подходящими объемами

Приведенный выше пример можно упростить, используя команду docker run —volumes-fromflag. Это обеспечивает механизм автоматического монтирования томов, которые уже используются существующим контейнером:

docker run -d —volumes-from example —name backup backup-image: latest

На этот раз резервный контейнер получит том с общими данными, смонтированный в его каталог / data. Флаг —volumes-from извлекает все определения томов, прикрепленные к примеру контейнера. Он особенно идеально подходит для заданий резервного копирования и других недолговечных контейнеров, которые действуют как вспомогательные компоненты для вашей основной службы.

Повышение безопасности с помощью креплений только для чтения

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

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

docker run -d -v shared-data: / backup-source: ro —name backup резервный образ: последний

Добавление ro в качестве третьего параметра, разделенного двоеточиями, к флагу -v указывает, что том должен быть смонтирован в режиме только для чтения. Вы также можете написать readonly вместо ro в качестве более явной альтернативы.

Обмен данными по сети

Вы можете использовать сетевые обмены как альтернативный подход к обмену данными через тома файловой системы. Присоединение двух контейнеров к одной сети Docker позволяет им беспрепятственно взаимодействовать с использованием автоматически назначаемых имен хостов:

docker network создать demo-network docker run -d —net demo-network —name first example-image: latest docker run -d —net demo-network —name second another-image: latest

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

Продолжая пример резервного копирования, теперь ваш контейнер резервного копирования может сделать сетевой запрос на http: // example: 8080 / backup-data, чтобы получить данные для резервного копирования. Пример контейнера должен ответить архивом, содержащим все данные, которые необходимо сохранить. Затем контейнер резервного копирования отвечает за сохранение архива в подходящем месте для хранения.

Обеспечение того, чтобы обмен данными происходил по сети, часто помогает усилиям по разъединению. В итоге вы получаете четко определенные интерфейсы, которые не создают жестких зависимостей между сервисами. Доступ к данным можно более точно контролировать, предоставляя API для каждого типа данных, вместо того, чтобы предоставлять каждому контейнеру полный доступ к тому.

При использовании этого подхода важно учитывать безопасность. Убедитесь, что любые HTTP API, предназначенные для внутреннего доступа других ваших контейнеров Docker, не имеют портов, открытых в мостовой сети вашего хоста Docker. Это поведение по умолчанию при использовании параметров сети, показанных выше; привязка порта с -p 8080: 8080 позволит получить доступ к API резервного копирования через сетевые интерфейсы вашего хоста. Это будет проблемой безопасности.

Резюме

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

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

Программы для Windows, мобильные приложения, игры - ВСЁ БЕСПЛАТНО, в нашем закрытом телеграмм канале - Подписывайтесь:)

Похожие записи

Добавить комментарий

Ваш адрес email не будет опубликован.