Расскажи про сети в Docker

«Расскажи про сети в Docker» — вопрос из категории Docker, который задают на 23% собеседований Devops Инженер. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

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

Основные типы сетей и их применение:

  1. bridge (по умолчанию): Изолированная внутренняя сеть на хосте. Контейнеры получают IP из подсети моста и могут общаться друг с другом. Для доступа извне порты пробрасываются флагом -p. Пользовательские мосты (docker network create) позволяют лучше организовать сервисы и предоставляют встроний DNS по имени контейнера.

    # Создание изолированной сети для группы сервисов
    docker network create --driver bridge --subnet 172.20.0.0/16 backend-net
    docker run -d --name app --network backend-net my-app:latest
    docker run -d --name db --network backend-net postgres:15
    # Контейнер 'app' может подключиться к 'db' по имени хоста 'db'
  2. host: Контейнер использует сетевой стек хоста напрямую. Нет изоляции, но максимальная производительность. Используется для высоконагруженных сетевых задач (например, прокси-серверы).

  3. none: У контейнера нет сетевых интерфейсов. Полезно для изолированных задач, например, batch-обработки данных, не требующих сети.

  4. overlay: Ключевая сеть для Docker Swarm. Позволяет контейнерам на разных физических хостах общаться в единой виртуальной сети. Аналоги реализуются CNI-плагинами в Kubernetes (Calico, Flannel, Cilium).

  5. macvlan: Назначает контейнеру реальный MAC-адрес, делая его видимым в физической сети как отдельное устройство. Используется для легаси-приложений, которым нужен выделенный IP в корпоративной сети.

В реальных проектах я чаще всего работаю с пользовательскими bridge-сетями для композов Docker и overlay-подобными сетями в Kubernetes, где управление сетевой политикой (NetworkPolicy) становится критически важным для безопасности.