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 создаёт публикацию порта.