Docker networking — подсистема управления сетевым взаимодействием Docker-контейнеров. По умолчанию каждый контейнер получает собственный сетевой namespace с виртуальным сетевым интерфейсом (veth) и подключается к виртуальному мосту docker0. Контейнеры изолированы от хост-сети, пока явно не открыты порты.
Как работает
Docker поддерживает несколько сетевых драйверов:
- bridge (по умолчанию) — виртуальный коммутатор
docker0. Контейнеры в одной bridge-сети видят друг друга по имени (DNS-резолвинг внутри Docker). Подходит для одного хоста. - host — контейнер использует сеть хост-системы без изоляции. Максимальная производительность, но конфликты портов с хостом.
- overlay — распределённая сеть поверх нескольких хостов (Docker Swarm / Kubernetes). Использует VXLAN для туннелирования.
- macvlan — контейнер получает MAC-адрес и подключается напрямую к физической сети. Для сценариев, где контейнер должен быть виден как физическое устройство.
- none — полное отсутствие сети. Для изолированных задач обработки данных.
Публикация портов: docker run -p 8080:80 nginx пробрасывает порт 8080 хоста на порт 80 контейнера через iptables-правила. В Docker Compose: ports: ["8080:80"]. Контейнеры одной пользовательской bridge-сети резолвят друг друга по именам сервисов без публикации портов.
История
Сетевая подсистема Docker существенно переработана в версии 1.9 (2015): появилась CNM (Container Network Model) с плагинами. До этого контейнеры связывались через устаревший механизм --link. Overlay-сети на основе VXLAN появились вместе с Docker Swarm. CNI (Container Network Interface) — альтернативный стандарт, принятый Kubernetes, отличается от Docker CNM.
Docker networking: overlay и macvlan
Overlay network позволяет контейнерам на разных хостах общаться напрямую — основа Docker Swarm. Использует VXLAN-туннели. Macvlan network присваивает контейнеру реальный MAC-адрес и IP из физической сети — контейнер выглядит как физическое устройство в сети. Используется для контейнеров, которым нужен собственный IP в LAN (например, IoT-устройства, legacy-системы требующие определённого IP).
Диагностика сетевых проблем Docker: docker network inspect bridge — текущие контейнеры в сети и их IP, docker exec container ping другой_контейнер — проверка связности, docker run --network host — отключение изоляции для отладки. nsenter для прямого входа в network namespace контейнера: nsenter -t $(docker inspect -f '{{.State.Pid}}' container) -n bash.
На что обращать внимание
В Docker Compose рекомендуется создавать явные пользовательские сети вместо использования сети default — это даёт контроль над тем, какие сервисы видят друг друга. Проблема производительности: overlay-сети добавляют накладные расходы (~5–15% throughput) из-за VXLAN-инкапсуляции. Для высоконагруженных сервисов на одном хосте лучше bridge или host. Диагностика: docker network inspect имя-сети показывает подключённые контейнеры и их IP.
Сеть Docker на практике
По умолчанию контейнеры Docker помещаются в bridge-сеть bridge (172.17.0.0/16). Для multi-container приложений создавайте именованные bridge-сети — контейнеры в одной сети могут обращаться друг к другу по имени контейнера. nginx-контейнер обращается к PHP-FPM через http://php:9000, если оба в одной compose-сети. Overlay-сети используются в Docker Swarm и Kubernetes для связи контейнеров на разных серверах. Host-сеть (--network host) даёт контейнеру прямой доступ к сетевому стеку хоста — быстрее, но без изоляции портов.