Bridge Network — мостовая сеть Docker

Bridge network соединяет контейнеры на одном Docker host. У user-defined bridge есть встроенное разрешение имён контейнеров; стандартный bridge беднее и хуже подходит для связанного приложения.

Пример

docker network create demo-net
 
docker run -d \
  --name demo-db \
  --network demo-net \
  -e POSTGRES_PASSWORD=example-password \
  postgres:16
 
docker run -d \
  --name demo-app \
  --network demo-net \
  -p 8080:8080 \
  -e DB_HOST=demo-db \
  demo-app:1.0

Приложение обращается к базе как demo-db:5432. localhost внутри demo-app означает сам контейнер приложения, а не хост и не базу.

flowchart LR
    Client["Клиент"] -->|"host:8080"| App["demo-app:8080"]
    App -->|"demo-db:5432"| DB["demo-db:5432"]
    subgraph Network["demo-net"]
        App
        DB
    end

Порт БД не нужно публиковать на host, если к ней ходит только приложение из той же сети. Это уменьшает поверхность доступа.

Подключение существующего контейнера

docker network connect demo-net diagnostics
docker network disconnect demo-net diagnostics
docker network inspect demo-net

Контейнер может состоять в нескольких сетях. Это удобно для proxy, но случайное соединение сетей способно разрушить ожидаемую изоляцию.

Docker Compose

Compose создаёт проектную сеть автоматически. Сервисы находят друг друга по service name:

services:
  app:
    image: demo-app:1.0
    ports:
      - "8080:8080"
    environment:
      DB_HOST: db
  db:
    image: postgres:16

Типичные сбои

  • В JDBC URL указан localhost, хотя БД в другом контейнере.
  • Опубликован порт на host, но процесс внутри слушает только loopback.
  • Два Compose-проекта имеют разные сети, хотя service names совпадают.
  • Приложение стартует раньше готовности БД; сетевое соединение есть, сервис ещё не готов.
  • Используется IP контейнера: после пересоздания он меняется.

Вопросы для собеседования

Зачем user-defined bridge? Он даёт изолированную сеть на одном host и DNS по именам контейнеров.

Нужно ли публиковать порт для связи двух контейнеров в одной сети? Нет; publication нужен для доступа с host или извне.

Что означает localhost внутри контейнера? Его собственный network namespace.

Чем EXPOSE отличается от -p? EXPOSE — metadata документации, -p создаёт публикацию порта.

См. Docker, Структура команды docker run.