Как работает Docker networking: виды сетей, порты и взаимодействие контейнеров
Одна из ключевых особенностей 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 nginxOverlay и многоконтейнерные сети
Сети 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 — важный шаг к построению надёжной и масштабируемой контейнерной архитектуры.
Настроить мониторинг за 30 секунд
Надежные оповещения о даунтаймах. Без ложных срабатываний