← Назад к вопросам

Что такое Container Network Module (CNM) в Docker?

3.0 Senior🔥 62 комментариев
#Docker и контейнеризация#Сети и протоколы

Комментарии (2)

🐱
deepseek-v3.2PrepBro AI6 апр. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Container Network Model (CNM) в Docker

Container Network Model (CNM) — это концептуальная архитектурная модель, разработанная компанией Docker для стандартизации и унификации подключения сетевых ресурсов к контейнерам. Она определяет абстракции и API, которые позволяют создавать гибкие, модульные и расширяемые сетевые решения для контейнерных сред. CNM была представлена как ответ на растущую сложность управления сетями в распределённых системах и стала фундаментом для сетевой подсистемы Docker.

Ключевые абстракции модели CNM

Модель CNM базируется на трёх основных сущностях:

  1. Песочница (Sandbox) — изолированное пространство, содержащее сетевую конфигурацию контейнера. Каждый контейнер связан с одной песочницей, которая хранит его сетевой стек (интерфейсы, таблицы маршрутизации, DNS-конфигурацию). Песочница обеспечивает изоляцию на уровне сети.

    // Примерная логическая структура (не реальный код Docker)
    type Sandbox struct {
        ID        string
        ContainerID string
        Interfaces []NetworkInterface
        DNS        DNSConfig
        Routes     []Route
    }
    
  2. Конечная точка (Endpoint) — виртуальный сетевой интерфейс, который соединяет песочницу с конкретной сетью. Именно через конечную точку контейнер получает IP-адрес и возможность обмениваться данными. Одна песочница может иметь несколько конечных точек, подключённых к разным сетям.

    # Пример: внутри контейнера можно увидеть интерфейсы, соответствующие endpoint'ам
    docker exec -it my_container ip addr show
    # eth0@if123: <BROADCAST,MULTICAST,UP,LOWER_UP> ... inet 172.18.0.2/16
    # Здесь eth0 — это виртуальный интерфейс, представляющий endpoint.
    
  3. Сеть (Network) — виртуальная коммуникационная зона, объединяющая группу конечных точек. Сеть обеспечивает связность между всеми контейнерами, подключёнными к ней, и изолирует их от контейнеров в других сетях. Примеры сетей в Docker: bridge, overlay, macvlan.

Принцип работы CNM

Когда пользователь создаёт контейнер и подключает его к сети, происходит следующая последовательность действий:

  • Создание песочницы: Docker Engine создаёт изолированное сетевое пространство для контейнера.
  • Создание конечной точки: Для указанной сети создаётся виртуальный интерфейс (endpoint).
  • Присоединение к сети: Конечная точка подключается к сети, получая от неё IP-адрес и другие параметры (например, через IPAM — IP Address Management).
  • Встраивание в песочницу: Конечная точка помещается внутрь песочницы контейнера, становясь его сетевым интерфейсом.

Интерфейс IPAM (IP Address Management) — это обязательный компонент CNM, отвечающий за выделение и управление IP-адресами, шлюзами по умолчанию и другими параметрами подсети для сетей. Он позволяет избежать конфликтов адресов.

Реализация и драйверы

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

  • Встроенные драйверы:
    *   `bridge` (стандартная сеть `docker0`) — создаёт изолированный мост на хосте.
    *   `host` — убирает изоляцию, используя сетевой стек хоста напрямую.
    *   `overlay` — создаёт распределённые сети поверх физической инфраструктуры (для Swarm/кластеров).
    *   `macvlan` и `ipvlan` — назначают контейнерам реальные MAC/IP-адреса, делая их полноправными участниками физической сети.
    *   `none` — отключает сеть для контейнера.

  • Сторонние (remote) драйверы: Позволяют интегрировать Docker с продвинутыми SDN-решениями (Software-Defined Networking), такими как Weave Net, Calico, Cilium, Contiv. Эти драйверы реализуют сложную политику безопасности, балансировку нагрузки, шифрование трафика.
# Пример создания пользовательской сети с драйвером bridge
docker network create --driver bridge --subnet 10.5.0.0/16 my_custom_net

# Подключение работающего контейнера к сети (создаст новый endpoint)
docker network connect my_custom_net my_container

CNM vs CNI

Важно понимать различие между CNM (Docker) и CNI (Container Network Interface, стандарт от Kubernetes). Это две конкурирующие модели с разными подходами. CNM — более комплексная модель, управляемая демоном Docker, в то время как CNI — это минималистичный стандарт, основанный на вызове исполняемых файлов-плагинов. Инструменты вроде dockershim или сетевые плагины могут выступать мостом между ними, но сегодня, с уходом Docker из K8s, экосистема стандартизируется вокруг CNI.

Значение и итоги

CNM сыграла революционную роль, предоставив:

  • Стандартизацию: Единый API для управления сетями контейнеров.
  • Изоляцию и безопасность: Чёткое разделение сетевых доменов.
  • Гибкость и расширяемость: Возможность использовать как простые, так и корпоративные сетевые решения через драйверы.
  • Мультихостовую поддержку: Через драйвер overlay для кластерных деплоев.

Несмотря на то, что в экосистеме Kubernetes доминирует CNI, CNM остаётся критически важной и зрелой моделью внутри standalone-сред Docker, обеспечивая надёжную, предсказуемую и мощную сетевую инфраструктуру для контейнерных приложений. Понимание её принципов — основа для глубокой диагностики сетевых проблем и проектирования эффективных контейнерных архитектур.

Что такое Container Network Module (CNM) в Docker? | PrepBro