Overlay-сети в Docker Swarm: пошаговое создание и настройка кластера для микросервисов | AdminWiki
Timeweb Cloud — сервера, Kubernetes, S3, Terraform. Лучшие цены IaaS.
Попробовать

Overlay-сети в Docker Swarm: пошаговое создание и настройка кластера для микросервисов

25 мая 2026 8 мин. чтения

Overlay-сеть в Docker Swarm - это виртуальная сетевая инфраструктура, которая объединяет несколько физических или виртуальных хостов в единый кластер. Она позволяет контейнерам, запущенным на разных узлах, общаться так, будто они находятся в одной локальной сети. Это фундаментальный компонент для развертывания отказоустойчивых и легко масштабируемых микросервисных приложений.

Без overlay-сети контейнеры на одном хосте не могут напрямую взаимодействовать с контейнерами на другом. Swarm использует эту технологию для автоматической маршрутизации трафика между узлами, обеспечивая прозрачную коммуникацию для сервисов. В этом руководстве вы получите пошаговые инструкции по созданию overlay-сети, подключению сервисов, настройке безопасности и диагностике проблем. Информация проверена на реальных конфигурациях и актуальна для Docker Engine версий 20.10 и выше, включая актуальные релизы 2026 года.

Что такое overlay-сеть и почему она нужна в Swarm кластере

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

Основное отличие от стандартной bridge-сети заключается в области действия. Bridge-сеть работает только в пределах одного хоста Docker. Overlay-сеть работает на всех узлах, присоединенных к Swarm кластеру. Это делает ее идеальной для распределенных микросервисов, где компоненты приложения должны работать согласованно на разных серверах.

Ключевые преимущества overlay-сетей для микросервисов:

  • Автоматическая маршрутизация между узлами: Swarm сам прокладывает сетевые пути.
  • Отказоустойчивость: При падении узла задачи сервиса перезапускаются на других узлах, сохраняя сетевую идентичность.
  • Масштабируемость: Новые реплики сервиса автоматически подключаются к сети, где бы они ни были запущены.
  • Изоляция: Сети логически разделены, что позволяет сегментировать трафик (например, отделить фронтенд от базы данных).

Архитектурные принципы: как overlay-сеть делает вашу инфраструктуру масштабируемой

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

Типичная многоуровневая архитектура для production-среды включает:

  1. Сеть frontend: Для сервисов, принимающих входящий трафик от пользователей (например, веб-прокси, балансировщики нагрузки).
  2. Сеть backend: Для внутренних микросервисов приложения (API, обработчики данных).
  3. Сеть database: Для изолированного доступа к stateful-сервисам (базы данных, кэши).

Такая сегментация повышает безопасность. Вы можете использовать сетевые политики Docker (начиная с определенных версий) или настройки брандмауэра на хостах, чтобы ограничить трафик между сегментами. Например, сеть database может быть доступна только из сети backend, но не из frontend.

Архитектура на основе overlay-сетей идеально подходит для контейнеризированных микросервисов, потому что она отражает их распределенную природу. Каждый микросервис - это независимая задача Swarm, которая может быть запущена на любом узле. Overlay-сеть обеспечивает постоянный и предсказуемый способ связи между этими динамически размещаемыми задачами.

Для глубокого понимания сетевой архитектуры Docker, включая сравнение bridge, host и overlay драйверов, изучите наше руководство по сетевым драйверам Docker.

Практическое создание overlay-сети: пошаговые инструкции

Работа начинается с инициализации Swarm кластера. Если у вас еще нет кластера, выполните следующие команды на машине, которая станет менеджером. Убедитесь, что на всех узлах установлен Docker версии 20.10 или новее.

# На главном узле (менеджер)
docker swarm init --advertise-addr <IP-АДРЕС_МЕНЕДЖЕРА>

Команда выведет токен для присоединения рабочих узлов. Скопируйте его. На каждом рабочем узле выполните команду docker swarm join с указанием адреса менеджера и токена.

# На рабочем узле
docker swarm join --token <SWARM_JOIN_TOKEN> <IP-АДРЕС_МЕНЕДЖЕРА>:2377

После формирования кластера создайте overlay-сеть. Делать это нужно на узле-менеджере.

# Создание overlay-сети с именем 'backend'
docker network create -d overlay \
  --subnet 10.10.0.0/24 \
  --attachable \
  backend

Разберем ключевые флаги:

  • -d overlay: Указывает драйвер overlay.
  • --subnet: Задает подсеть для сети. Это необязательно, но рекомендуется для избежания конфликтов IP-адресов.
  • --attachable: Позволяет подключать к сети не только сервисы Swarm, но и отдельные контейнеры (например, для отладки).

Проверьте создание сети:

docker network ls
# Найдите сеть 'backend' с типом 'overlay'
docker network inspect backend

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

Подключение сервисов Swarm к overlay-сети

Создать сервис и сразу подключить его к overlay-сети можно с помощью команды docker service create.

# Создание сервиса Nginx в overlay-сети 'backend'
docker service create \
  --name web_app \
  --replicas 3 \
  --network backend \
  --publish published=80,target=80,mode=ingress \
  nginx:alpine

Ключевой параметр - --network backend. Он указывает, в какой overlay-сети будет работать сервис. Все реплики этого сервиса, независимо от узла, получат IP-адрес из диапазона сети backend и смогут общаться друг с другом.

Для сложных развертываний используйте Docker Compose файл, совместимый со Swarm (файл stack.yml).

# docker-stack.yml
version: '3.8'

services:
  web:
    image: nginx:alpine
    deploy:
      replicas: 3
    networks:
      - backend

  api:
    image: myapp/api:latest
    deploy:
      replicas: 2
    networks:
      - backend

networks:
  backend:
    driver: overlay
    attachable: true

Разверните стек командой:

docker stack deploy -c docker-stack.yml myapp

Флаг --attachable, указанный при создании сети или в Compose-файле, позволяет вручную запустить контейнер и подключить его к сети для тестирования: docker run -it --network backend --rm alpine ping api.

Обеспечение безопасности: шифрование трафика в overlay-сети

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

Шифрование включается при создании сети с помощью опции --opt encrypted.

docker network create -d overlay \
  --opt encrypted \
  --subnet 10.20.0.0/24 \
  secure_backend

После создания сети убедитесь, что шифрование активно:

docker network inspect secure_backend | grep Encrypted
# Должен вернуться параметр "Encrypted": true

Важные ограничения и лучшие практики:

  • Производительность: Шифрование накладывает нагрузку на CPU. Производительность сети может снизиться на 10-30%. Оцените этот trade-off для вашей нагрузки.
  • Область действия: Шифрование работает только для трафика, проходящего между разными узлами Swarm. Трафик между контейнерами на одном хосте внутри overlay-сети не шифруется.
  • Обязательность для production: Все overlay-сети, передающие чувствительные данные (авторизационные токены, персональные данные, конфигурации), должны быть зашифрованы.
  • Нельзя добавить позже: Опцию encrypted нельзя включить для уже существующей сети. Сеть нужно пересоздать.

Для комплексного подхода к безопасности Docker, включая non-root-контейнеры, управление capabilities и сканирование образов, обратитесь к гайду по продвинутому Docker для DevOps.

Управление маршрутизацией и DNS: как сервисы находят друг друга

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

Например, если у вас есть сервис с именем api и сервис с именем database, запущенные в одной overlay-сети, контейнер внутри сервиса api может подключиться к базе данных, используя хостнейм database. Swarm автоматически распределит запрос между всеми задачами (репликами) сервиса database, обеспечивая балансировку нагрузки.

Управление публикацией портов происходит в двух режимах:

  • Режим ingress (по умолчанию): Порт публикуется на всей кластерной сетевой магистрали (ingress network). Запрос на любой узел кластера по опубликованному порту будет автоматически перенаправлен routing mesh на одну из задач сервиса. Это обеспечивает отказоустойчивость на уровне кластера.
  • Режим host: Порт публикуется напрямую на сетевом интерфейсе конкретного хоста, где запущена задача. Этот режим используется для систем, требующих прямой привязки к порту (например, некоторые балансировщики нагрузки). В этом режиме routing mesh не задействован.

Пример объявления портов в сервисе:

docker service create \
  --name my_service \
  --publish published=8080,target=80,mode=ingress \
  --publish published=3000,target=3000,mode=host \
  my_image

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

Диагностика и решение типичных проблем сети

Даже при корректной настройке могут возникнуть проблемы. Вот основные инструменты и методы диагностики.

1. Проверка состояния кластера и узлов. Убедитесь, что все узлы в состоянии Ready и Active.

docker node ls
# Все узлы должны иметь статус 'Ready'. Менеджер должен быть 'Leader' или 'Reachable'.

2. Проверка overlay-сетей. Убедитесь, что сеть создана и имеет тип overlay.

docker network ls | grep overlay
docker network inspect <network_name> | grep -A 5 -B 5 "Scope"

3. Проверка подключения сервисов к сети.

docker service ps <service_name>  # Проверяем, на каких узлах запущены задачи
docker service inspect <service_name> --pretty | grep Networks  # Какие сети использует сервис

4. Проблемы с консистентностью кластера. Если узлы теряют связь с менеджером, сетевые правила могут не синхронизироваться. Перезапустите демон Docker на проблемном узле или переприсоедините его к кластеру.

5. Ошибки подключения сервисов. Убедитесь, что имя сети в определении сервиса или стека точно соответствует имени созданной overlay-сети. Регистр имеет значение.

6. Проблемы с маршрутизацией (трафик не проходит между узлами). Проверьте, открыты ли необходимые порты для Swarm на брандмауэрах всех узлов (по умолчанию TCP порты 2377, 7946; UDP порт 4789).

Для диагностики также полезны логи сервиса:

docker service logs <service_name> --tail 50 --follow

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

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

Overlay-сеть - это технологическая основа для создания распределенных, отказоустойчивых приложений в Docker Swarm. Вы прошли полный цикл: от понимания архитектурных принципов до практического развертывания и отладки.

Ключевые шаги для успешного внедрения:

  1. Инициализируйте Swarm кластер с хотя бы одним менеджером и рабочими узлами.
  2. Спроектируйте сетевую сегментацию (например, frontend, backend, database) и создайте overlay-сети с помощью docker network create -d overlay.
  3. Для всех production-сетей обязательно используйте флаг --opt encrypted для шифрования межузлового трафика.
  4. Запускайте сервисы, явно указывая целевую overlay-сеть через --network или Docker Compose файл.
  5. Используйте встроенный DNS Swarm для коммуникации между сервисами по имени.
  6. Настройте мониторинг состояния узлов и сетей, используя стандартные команды docker node ls и docker network inspect.

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

Для автоматизации рутинных задач и интеграции различных AI-моделей в ваши DevOps-процессы вы можете рассмотреть использование агрегатора API, такого как AiTunnel, который предоставляет единый интерфейс для работы с нейросетями.

Поделиться:
Сохранить гайд? В закладки браузера