Перейти к содержанию

Сети

Сеть для контейнеров

Контейнеры Linux в основном состоят из процессов, выполняемых прямо в хост-системе, но на сетевом уровне они ведут себя совсем не так, как другие процессы.

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

Как это работает

Представим, что каждый контейнер Linux ведет себя как хост в частной сети. Сервер Docker в этом случае выступает как виртуальный мост, в контейнеры - клиенты, которые находятся за ним. Мост - это просто сетевое устройство, передающее трафик с одной стороны на другую.

Фактически у каждого контейнера есть виртуальный интерфейс Ethernet, подключенный к мосту Docker, и IP-адрес, назначенный виртуальному интерфейсу (см схему ниже)

Сеть в Docker
Сеть на типичном сервере Docker

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

Docker выделяет частные подсети из неиспользуемого блока частных подсетей (RFC 1918). Он определяет, какие блоки не используются на хосте, и назначает один из них виртуалной сети. Она соединяется мостом с локальной сетью хоста через интерфейс на сервере, который называется docker0. Это означает, что по умолчанию все контейнеры находятся в сети и могут взаимодействовать друг с другом напрямую, но для обращения к хосту или внешнему миру им требуется интерфейс виртуального моста docker0.

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

Примечание

Можно настроить сеть отдельно для каждого контейнера или полностью отключить виртуальную сеть для контейнера, указав параметр --net=host для команды docker container run. В этом режиме контейнеры используют сетевые устройства и адрес хоста, обходясь без виртуальных интерфейсов или мостов.

Warning

При работе с сетью в Docker необходимо помнить о безопасности.


Инфо про сети

bridge

При выполнении

docker run -d --name backend nginx
docker run -d --name frontend nginx

Контейнеры могут взаимодействовать по IP-адресам, но автоматическое разрешение имён контейнеров в стандартной сети bridge не работает.

Пользовательская сеть Docker

Создаем свою сеть:

docker network create my-network

Запускаем контейнеры

docker run -d --name backend --network my-network nginx

docker run -d --name frontend --network my-network nginx

В пользовательской сети Docker предоставляет встроенный DNS.

Теперь из контейнера frontend можно обращаться к:

http://backend:80

Именно поэтому при использовании Docker Compose сервисы обычно могут обращаться друг к другу по именам: Compose создаёт пользовательскую сеть.

Сравнение

Возможность Стандартный bridge Пользовательский bridge
Связь контейнеров по IP Да Да
Автоматическое разрешение имён Нет Да
Встроенный DNS для имён контейнеров Нет Да
Изоляция от других Docker-сетей Ограниченная Да, по умолчанию

Последняя проверка 12.10.2026