Как организовать сетевое взаимодействие между контейнерами в Docker Compose

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

Ответ

В Docker Compose контейнеры (сервисы) взаимодействуют друг с другом через внутреннюю виртуальную сеть, которую Compose создает автоматически для проекта.

Ключевой механизм — встроенный DNS-сервер. Каждый сервис получает DNS-имя, совпадающее с его названием в docker-compose.yml. Это позволяет обращаться к одному контейнеру из другого по имени, как к обычному хосту в сети.

Пример docker-compose.yml:

version: '3.8'

services:
  api:
    build: ./api
    # Порт 8000 доступен только внутри сети Docker
    expose:
      - "8000"

  frontend:
    build: ./frontend
    # Пробрасываем порт 80 контейнера на порт 8080 хоста
    ports:
      - "8080:80"

В этом примере:

  1. Сервис frontend может отправить запрос к сервису api по адресу http://api:8000.
  2. Docker Compose автоматически разрешит имя api во внутренний IP-адрес соответствующего контейнера.
  3. Пользователь может получить доступ к frontend через http://localhost:8080, но не может напрямую обратиться к api извне, так как его порт не проброшен с помощью ports.