Overlay network в Docker — виртуальная сеть, объединяющая контейнеры на разных физических или виртуальных хостах в единое адресное пространство. Контейнер на сервере A «видит» контейнер на сервере B как если бы они находились в одной локальной сети. Overlay network — основа для Docker Swarm: именно она обеспечивает связь сервисов между нодами кластера.
Как работает Overlay network
Overlay network использует протокол VXLAN (Virtual Extensible LAN, RFC 7348). Трафик между контейнерами инкапсулируется в UDP-пакеты и передаётся по физической сети хостов. Порт VXLAN: UDP 4789. Каждая overlay-сеть получает уникальный VNI (VXLAN Network Identifier). Docker-демоны на разных хостах обмениваются информацией об endpoint через встроенный gossip-протокол (порт 7946 TCP/UDP).
# Создать overlay network
docker network create --driver overlay --attachable mynet
# Запустить контейнер в overlay-сети
docker service create --network mynet --name web nginx
# Список сетей
docker network ls
# Детали сети
docker network inspect mynet
Шифрование трафика
Overlay network опционально шифрует трафик данных (data plane) через AES-GCM:
docker network create --driver overlay --opt encrypted mynet
Без опции encrypted управляющие сообщения зашифрованы (через TLS), но данные между контейнерами передаются незашифрованными по сети хостов. Для продакшна в публичных ЦОДах шифрование критично.
История
Docker Overlay network появился в Docker 1.9 (2015) вместе с введением multi-host networking. VXLAN как стандарт разработан VMware, Cisco и другими вендорами и стандартизирован в RFC 7348 (2014). В Docker Swarm mode (Docker 1.12, 2016) overlay network стала основой межноддового взаимодействия. В Kubernetes аналогичную роль играют CNI-плагины: Flannel (также VXLAN), Calico (BGP), Cilium (eBPF).
На что обращать внимание
Требования для overlay network: все ноды кластера должны быть доступны по портам TCP/UDP 2377, TCP/UDP 7946, UDP 4789. Проблемы с overlay часто вызваны файрволом, блокирующим UDP 4789. Производительность overlay ниже, чем у host network (~10–15% overhead на шифрование + VXLAN инкапсуляцию). Для высоконагруженных сервисов (>10 Гбит/с трафика между контейнерами) рассмотри host network или SR-IOV.
История Overlay network в Docker
Overlay network появился в Docker 1.9 (2015) вместе с Docker Swarm mode. До этого multi-host networking требовал сторонних решений (Weave, Flannel). Docker Overlay использует VXLAN (Virtual Extensible LAN, RFC 7348) — протокол инкапсуляции L2-фреймов в UDP-пакеты. VXLAN разработан VMware, Cisco и Arista в 2011 году для масштабирования виртуальных сетей в дата-центрах. Docker использует VXLAN с VNI (VXLAN Network Identifier), UDP-порт 4789.
Как работает Overlay network
При создании overlay network Docker создаёт VXLAN-туннель между хостами через VTEP (VXLAN Tunnel Endpoint) — виртуальный сетевой интерфейс vxlan0. Когда контейнер на Host A отправляет пакет контейнеру на Host B, VTEP инкапсулирует L2-фрейм в UDP/VXLAN-пакет и отправляет на физический IP Host B. Host B декапсулирует и доставляет в нужный контейнер. Для обнаружения адресов (ARP) в overlay Docker использует распределённое KV-хранилище.
Overlay network vs Bridge network vs Host network
| Тип сети | Область | Производительность | Применение |
|---|---|---|---|
| Overlay | Multi-host (Swarm) | Накладные расходы VXLAN | Swarm services, K8s |
| Bridge | Один хост | Высокая | Docker Compose |
| Host | Один хост | Максимальная (нет NAT) | High-performance services |
На что обращать внимание
Для overlay network с шифрованием (--opt encrypted) требуется открытый UDP-порт 4789 между нодами Swarm. Производительность overlay немного ниже host network из-за VXLAN-инкапсуляции (~10–15% overhead). Для высоконагруженных сервисов (>10 Гбит/с трафика между контейнерами) рассматривай host network или SR-IOV. В Kubernetes аналог overlay — CNI-плагины (Flannel, Calico, Cilium) — используют те же VXLAN или BGP.