Сети Docker и драйвер bridge

Как контейнеры объединяются в сети и зачем создавать собственную сеть вместо стандартной.

Сеть Docker — виртуальная сеть, в которой контейнеры могут обмениваться трафиком; драйвер bridge — стандартный для одного хоста.

Зачем контейнерам сеть

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

Управление сетями

# Список сетей
docker network ls

Вывод:

NETWORK ID     NAME      DRIVER    SCOPE
9f1a2b3c4d5e   bridge    bridge    local
0a1b2c3d4e5f   host      host      local
1b2c3d4e5f6a   none      null      local

Драйвер bridge — самый частый: он создаёт изолированную сеть на одном хосте. Есть и другие (host, none), но для связи контейнеров нужен именно bridge.

Почему создают свою сеть

Ключевой момент: в пользовательской bridge-сети контейнеры видят друг друга по имени (работает встроенный DNS). В стандартной сети bridge такого нет — там пришлось бы использовать IP-адреса, которые меняются. Поэтому для связки контейнеров всегда создают отдельную сеть.

# Создать пользовательскую сеть
docker network create my-net

# Подробности о сети
docker network inspect my-net

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

Контейнер подключают к сети флагом --network при запуске:

docker run -d --name db --network my-net \
  -e POSTGRES_PASSWORD=secret postgres:16

docker run -d --name api --network my-net \
  -p 8000:8000 my-app:1.0

Оба контейнера в сети my-net и теперь могут общаться. Уже работающий контейнер можно подключить к сети командой docker network connect my-net ИМЯ.

КомандаЧто делает
docker network lsсписок сетей
docker network create ИМЯсоздать пользовательскую сеть
--network ИМЯподключить контейнер при запуске
docker network connect ИМЯ КОНТподключить работающий контейнер

Итог

  • Контейнеры общаются через виртуальные сети Docker; стандартный драйвер — bridge.
  • В пользовательской bridge-сети работает DNS по имени контейнера, в дефолтной — нет.
  • Сеть создают через docker network create, подключают флагом --network.
Проверьте себя
1. Какой драйвер сети используется по умолчанию для контейнеров на одном хосте?
Ahost
Bbridge
Coverlay
Dnone
2. Зачем создавать пользовательскую сеть вместо стандартной bridge?
AЧтобы контейнеры работали быстрее
BЧтобы контейнеры могли обращаться друг к другу по имени через встроенный DNS
CЧтобы уменьшить размер образов
DЧтобы отключить интернет в контейнерах
3. Как подключить контейнер к сети my-net при запуске?
A-p my-net
B--network my-net
C-v my-net
D--net-create my-net
Поддержать проект