Ответ
В Docker есть несколько механизмов для организации взаимодействия контейнеров. Я выбираю подход в зависимости от задачи.
1. Пользовательские bridge-сети (рекомендуемый способ): Docker создает изолированную сеть, где контейнеры могут обращаться друг к другу по имени.
# Создаем пользовательскую сеть
docker network create my-app-network
# Запускаем контейнеры в этой сети
docker run -d --name database --network my-app-network postgres:15
docker run -d --name backend --network my-app-network -e DB_HOST=database my-backend-app
# Контейнер 'backend' может подключиться к 'database' по hostname 'database'
2. Docker Compose (стандарт для разработки): Compose автоматически создает сеть для проекта. Сервисы видят друг друга по имени сервиса.
services:
postgres:
image: postgres:15
environment:
POSTGRES_PASSWORD: secret
api:
build: ./api
environment:
DB_URL: postgres://postgres:secret@postgres:5432/mydb
ports:
- "8080:8080"
# Контейнер 'api' разрешит hostname 'postgres' в IP-адрес контейнера с БД
3. Host-сеть (для максимальной производительности): Контейнер использует сетевой стек хоста. Подходит для высоконагруженных прокси или сетевых утилит.
docker run --network host nginx:alpine
# Nginx будет слушать порт 80 напрямую на сетевом интерфейсе хоста
4. Общие тома (Volumes) для обмена данными: Используется для передачи файлов (конфигов, статики, логов).
# Создаем том
docker volume create app-config
# Монтируем один и тот же том в разные контейнеры
docker run -d --name generator -v app-config:/data alpine sh -c "echo 'config' > /data/file.txt"
docker run --rm -v app-config:/data alpine cat /data/file.txt # Выведет 'config'
5. Связь контейнеров на разных хостах: Для этого используются overlay-сети в Docker Swarm или, что чаще в продакшене, сервисная сеть Kubernetes (CNI).
В реальных проектах я использую пользовательские сети Docker или Docker Compose для локальной разработки и тестирования, а для продакшена — сетевую модель Kubernetes (Services, Ingress), которая предоставляет более надежный и функциональный механизм для общения сервисов.