Гид по технологиям

Обмен данными между Docker‑контейнерами: тома, сети и лучшие практики

6 min read Docker Обновлено 01 Dec 2025
Обмен данными между Docker‑контейнерами
Обмен данными между Docker‑контейнерами

Схема обмена данными между контейнерами Docker через тома и сеть

Кратко: для обмена данными между контейнерами используйте Docker‑тома для совместного доступа к файловой системе или сеть и HTTP/API для более строгой изоляции. Монтируйте тома только для чтения там, где контейнеры не должны изменять данные, и применяйте сетевые правила и аутентификацию для внутренних API.

Быстрые ссылки

  • Использование томов для совместного каталога
  • Быстрый запуск контейнеров с одинаковыми томами
  • Повышение безопасности с помощью монтирования только для чтения
  • Обмен данными по сети
  • Дополнительно: контроль безопасности, чек-листы и playbook

Короткие определения

  • Тома: независимые хранилища Docker, монтируемые в контейнеры, данные сохраняются вне контейнера.
  • Mount: точка подключения тома к файловой системе контейнера.
  • Сеть Docker: логический сетевой слой, позволяющий контейнерам общаться по именам.

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

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

Создайте том:

docker volume create --name shared-data

Запустите контейнер и смонтируйте том в ожидаемый путь внутри контейнера:

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

В этом примере контейнер backup получит доступ к тому, который использует example: изменения, сделанные в /data контейнером example, будут видимы в /backup-source контейнера backup и наоборот.

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

Быстрый запуск контейнеров с одинаковыми томами

Простой способ повторно использовать все тома, уже смонтированные в существующем контейнере — флаг –volumes-from. Он автоматически подключит все тома из указанного контейнера к новому контейнеру.

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

Этот подход особенно полезен для вспомогательных задач: резервное копирование, миграции, кратковременные jobs. –volumes-from подтягивает определения всех томов, монтированных в контейнер example, и автоматически подключает их к backup.

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

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

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

Добавление :ro (или :readonly) делает монтирование доступным только для чтения.

Важно: это предотвращает изменения на уровне файловой системы контейнером, но не защищает от сетевого доступа или действий, выполняемых на стороне сервиса (например, API внутри контейнера, которое само записывает в другой путь).

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

Альтернативой совместного тома является обмен данными через сеть. Поместив контейнеры в одну Docker‑сеть, они получают возможность общаться по DNS‑именам, автоматически назначаемым Docker.

docker network create demo-network
docker run -d --net demo-network --name example example-image:latest
docker run -d --net demo-network --name backup backup-image:latest

Контейнер example сможет обращаться к контейнеру backup по имени и наоборот. Частый шаблон — предоставить в одном контейнере HTTP API, который выдает данные (например, архив для резервного копирования), а другой контейнер делает запрос и сохраняет данные в целевое хранилище.

Пример: backup делает запрос к http://example:8080/backup-data, example возвращает архив, backup сохраняет его в объектное хранилище.

Преимущества сетевого обмена:

  • Чётко определённые интерфейсы (API) и контракты.
  • Меньше прямых зависимостей на уровне файловой системы.
  • Проще контролировать права доступа и аутентификацию.

Недостатки:

  • Нужна реализация API и формат обмена данными.
  • Повышенная задержка и использование сети по сравнению с локальными томами.

Важно: не публикуйте внутренние порты контейнеров наружу (не используйте -p), если API предназначен только для внутренних контейнеров. Публикация порта откроет доступ извне и может стать источником уязвимости.

Когда использовать тома, а когда сеть

  • Используйте тома, если нужен совместный доступ к файловой структуре (большие файлы, кэш, состояние DB, очередь файлов).
  • Используйте сеть/API, если нужна слабая связность, версионирование интерфейсов, контроль доступа, или если данные представляют собой поток событий/архивов.

Mermaid диаграмма выбора:

flowchart TD
  A[Требуется обмен данными между контейнерами?] -->|Да| B{Нужен прямой доступ к файловой системе?}
  B -->|Да| C[Использовать тома]
  B -->|Нет| D[Использовать сеть/HTTP API]
  C --> E{Требуется запрет записи?}
  E -->|Да| F[Монтировать :ro]
  E -->|Нет| G[Монтировать в режиме rw]
  D --> H{Требуется безопасность/аутентификация?}
  H -->|Да| I[Организовать внутреннюю сеть и аутентификацию]
  H -->|Нет| J[Протоколы: HTTP/GRPC/AMQP]

Безопасность и рекомендации

  • Ограничивайте права доступа: монтируйте тома как readonly там, где это возможно.
  • Не публикуйте внутренние порты хоста, если сервисы предназначены только для внутреннего взаимодействия.
  • Применяйте сетевые политики и брандмауэры (Docker networks, firewalls) для сегментации.
  • Используйте аутентификацию и авторизацию для внутренних API (tokens, mTLS).
  • Логируйте доступ к критичным данным и регулярно проверяйте целостность.

Важно: защита на уровне контейнера — только часть общей стратегии безопасности. Храните секреты вне образов (Docker secrets, Vault) и не кладите их в тома, доступные многим контейнерам.

Playbook: как настроить контейнер резервного копирования (шаг за шагом)

  1. Создайте общий том:
docker volume create --name shared-data
  1. Запустите основной сервис, который пишет данные в /data:
docker run -d -v shared-data:/data --name example example-image:latest
  1. Подготовьте контейнер резервного копирования с минимальным набором утилит (tar, curl, aws cli и т.д.).
  2. Запустите контейнер backup, монтируя том только для чтения:
docker run -d -v shared-data:/backup-source:ro --name backup backup-image:latest
  1. Внутри backup: архивируйте /backup-source и отправьте в дальнее хранилище (S3, NFS, диск).
  2. Проверяйте периодически резервные копии на читаемость и целостность.
  3. При необходимости — используйте сеть: если сервис example может генерировать архив по запросу, сделайте backup клиентом HTTP к internal API.

Критерии приёмки

  • Резервная копия создаётся без ошибок в течение часа после запуска.
  • Архивы можно восстановить локально и в тестовой среде.
  • Контейнер backup не завершает работу с кодом ошибки.

Ролевые чек-листы

Разработчик:

  • Описать контракты API для сетевого обмена.
  • Не полагаться на файлы вне контейнера без явного тома.
  • Не хранить секреты в образе.

DevOps / инженер по эксплуатации:

  • Управлять томами и правами доступа.
  • Настроить сети и правила публикации портов.
  • Автоматизировать создание и мониторинг резервных копий.

Инженер по безопасности:

  • Проверить, не открыты ли внутренние порты наружу.
  • Настроить аутентификацию внутренних API.
  • Оценить риск совместного доступа к томам и предложить mitigations.

Тестовые случаи и критерии приёмки

  • Тест 1: данные, записанные example в /data, доступны в backup в /backup-source (проверка md5/sha256).
  • Тест 2: монтирование :ro предотвращает создание/изменение файла внутри backup (ожидаемая ошибка записи).
  • Тест 3: при использовании сети backup получает архив по запросу и успешно сохраняет в целевое хранилище.

Критерии приёмки: все тесты проходят в CI, резервная копия успешна и восстанавливаема.

Совместимость и миграция

  • При миграции контейнера на другую хост‑машину убедитесь, что томы перенесены или доступны (например, через сетевую файловую систему или репликацию). Docker volume по умолчанию локален для хоста.
  • Для распределённых сред используйте сетевые хранилища (NFS, CIFS, блочные устройства) или облачные сервисы (S3, GCS) и сохраняйте в них архивы.

Небольшая методология принятия решения

  1. Определите тип данных: большие файлы/кэш/состояние или запрос-ответ.
  2. Выберите модель доступа: файловая (тома) или сервисная (API).
  3. Примените ограничение прав: readonly, аутентификация, сетевые политики.
  4. Автоматизируйте резервное копирование и тесты восстановления.

Фактбокс — ключевые идеи

  • Тома хранят данные вне контейнера и переживают пересоздание контейнера.
  • –volumes-from позволяет быстро подключать все тома из существующего контейнера.
  • :ro ставит том в режим только для чтения.
  • Сетевой обмен удобен для слабосвязанных сервисов и лучшего контроля доступа.

Короткий глоссарий

  • Тома — persistent storage Docker.
  • :ro — монтирование только для чтения.
  • –volumes-from — копирование подключённых томов из другого контейнера.
  • Docker network — виртуальная сеть для контейнеров.

Итог

Тома — основной инструмент для совместного доступа к файловой системе между контейнерами; --volumes-from упрощает подключение, а :ro повышает безопасность. Сетевая модель через API даёт лучшую модульность и контроль доступа, но требует реализации интерфейсов. Всегда проектируйте взаимодействие так, чтобы минимизировать жёсткие зависимости и применять принципы наименьших прав.

Важно: чётко документируйте контракты между сервисами и регулярно тестируйте процедуры резервного копирования и восстановления.

Поделиться: X/Twitter Facebook LinkedIn Telegram
Автор
Редакция

Похожие материалы

HANDLE_ERROR_ON_CRITICAL_THREAD — как исправить BSOD
Windows

HANDLE_ERROR_ON_CRITICAL_THREAD — как исправить BSOD

Устранение утечки памяти LockAppHost.exe в Windows 10
Windows 10

Устранение утечки памяти LockAppHost.exe в Windows 10

Ошибка AppHangB1: способы исправления
Windows

Ошибка AppHangB1: способы исправления

Жесты головы на AirPods в iOS 18
Гаджеты

Жесты головы на AirPods в iOS 18

Тестовая лаборатория в VirtualBox
Виртуализация

Тестовая лаборатория в VirtualBox

ZIP на Chromebook: сжатие и распаковка
Chromebook

ZIP на Chromebook: сжатие и распаковка