Как работает Docker networking: виды сетей, порты и взаимодействие контейнеров

9 минут чтения
Средний рейтинг статьи — 4.6

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

В этой статье разберём, какие типы сетей бывают в Docker, как контейнеры обмениваются данными и как организовать связь между ними и хостом.

Основные типы сетей Docker

Docker поддерживает несколько типов сетей, каждая из которых решает разные задачи.

Тип сетиНазначениеОсобенности
bridgeСеть по умолчанию для контейнеровКонтейнеры могут общаться между собой по имени, но изолированы от внешнего мира
hostКонтейнер использует сетевой стек хостаМаксимальная производительность, но нет изоляции портов
noneПолная изоляция контейнера от сетиИспользуется для задач без доступа к сети
overlayСвязь между контейнерами на разных хостах (в Swarm)Требует Docker Swarm или другой оркестратор
macvlanПрямое подключение контейнера к физической сетиКонтейнер получает свой MAC-адрес и IP, как отдельное устройство

Сеть bridge — стандарт по умолчанию

Когда вы создаёте контейнер без указания сети, Docker подключает его к сети bridge.

docker run -d --name web nginx

Эта команда создаёт контейнер и помещает его в виртуальную сеть bridge.
Посмотреть список сетей можно так:

docker network ls

Вывод будет примерно таким:

NETWORK ID     NAME      DRIVER    SCOPE
a7f9c13d3e7b   bridge    bridge    local
f3b10f5aa24e   host      host      local
c1b3d08c7a2c   none      null      local

Контейнеры внутри одной bridge-сети могут пинговать друг друга по имени, если они подключены к одной пользовательской сети:

docker network create mynet
docker run -d --name db --network mynet postgres
docker run -d --name app --network mynet nginx

Теперь контейнер app может обратиться к db по имени db (через DNS, встроенный в Docker).

Сеть host

Сеть host используется, когда нужно убрать сетевую изоляцию между контейнером и хостом:

docker run -d --network host nginx

В этом режиме контейнер не получает отдельный IP — он использует сетевой стек хостовой системы.
Это повышает производительность, но также снимает ограничения на порты (если контейнер и хост используют один и тот же порт, произойдёт конфликт).

Сеть none

Если задать тип сети none, контейнер не будет иметь вообще никакого сетевого интерфейса (кроме lo — localhost):

docker run -d --network none alpine sleep 9999

Такой режим используется для задач, где сеть не нужна — например, вычислений или безопасных sandbox-сред.

Пользовательские сети bridge

По умолчанию все контейнеры, запущенные без указания сети, попадают в общую bridge, где DNS не работает по именам контейнеров.
Поэтому рекомендуется создавать пользовательские сети:

docker network create myapp
docker run -d --name backend --network myapp flask-app
docker run -d --name frontend --network myapp nginx

Теперь frontend может обращаться к backend по имени backend:порт, не зная его IP.

Проброс портов

Чтобы контейнер был доступен извне, нужно пробросить порты:

docker run -d -p 8080:80 nginx

Синтаксис:
-p <порт_хоста>:<порт_контейнера>

Таким образом, запросы на http://localhost:8080 перенаправляются в контейнер на порт 80.

Можно указать диапазон:

docker run -d -p 8080-8082:80 nginx

Или привязать только к определённому IP интерфейсу:

docker run -d -p 127.0.0.1:8080:80 nginx

Overlay и многоконтейнерные сети

Сети overlay используются в Docker Swarm и Kubernetes для соединения контейнеров, работающих на разных физических или виртуальных хостах.

Пример создания overlay-сети:

docker network create -d overlay myoverlay

Контейнеры, подключённые к этой сети на разных нодах, смогут обмениваться данными по внутренним адресам, даже если находятся на разных серверах.

Сеть macvlan

Если нужно, чтобы контейнер выглядел как отдельное устройство в локальной сети, используется macvlan:

docker network create -d macvlan \
  --subnet=192.168.1.0/24 \
  --gateway=192.168.1.1 \
  -o parent=eth0 pubnet

Теперь контейнеры, подключённые к pubnet, будут получать свои IP прямо из подсети локальной сети, и к ним можно будет обращаться напрямую с других устройств.

Просмотр информации о сети

Чтобы получить подробную информацию о сети:

docker network inspect myapp

Пример вывода (сокращённо):

{
  "Name": "myapp",
  "Driver": "bridge",
  "Containers": {
    "a3d2b1c4e": {
      "Name": "backend",
      "IPv4Address": "172.18.0.2/16"
    }
  }
}

Удаление сети

Чтобы удалить неиспользуемую сеть:

docker network rm myapp

Или очистить все неиспользуемые сети:

docker network prune

Заключение

Система сетей Docker — мощный инструмент для организации взаимодействия контейнеров.
С её помощью можно легко:

  • изолировать сервисы друг от друга;
  • безопасно открывать нужные порты наружу;
  • подключать контейнеры к общей сети на нескольких хостах;
  • моделировать реальную инфраструктуру прямо на локальной машине.

Понимание принципов Docker networking — важный шаг к построению надёжной и масштабируемой контейнерной архитектуры.

9 минут чтения
Средний рейтинг статьи — 4.6

Настроить мониторинг за 30 секунд

Надежные оповещения о даунтаймах. Без ложных срабатываний