Как организовать общение между контейнерами в Docker?

«Как организовать общение между контейнерами в Docker?» — вопрос из категории Docker, который задают на 23% собеседований Devops Инженер. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

В 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), которая предоставляет более надежный и функциональный механизм для общения сервисов.