Ответ
В 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"
В этом примере:
- Сервис
frontendможет отправить запрос к сервисуapiпо адресуhttp://api:8000. - Docker Compose автоматически разрешит имя
apiво внутренний IP-адрес соответствующего контейнера. - Пользователь может получить доступ к
frontendчерезhttp://localhost:8080, но не может напрямую обратиться кapiизвне, так как его порт не проброшен с помощьюports.