Ответ
Да, по умолчанию Docker Compose создает единую сеть типа bridge для всех сервисов, определенных в файле docker-compose.yml.
Это ключевая особенность, которая обеспечивает автоматическое обнаружение сервисов (service discovery).
- Имя сети: Генерируется автоматически по шаблону
<имя_директории>_default. - Взаимодействие: Все контейнеры в этой сети могут обращаться друг к другу по имени сервиса, которое Docker Compose использует как DNS-имя (hostname).
Пример (docker-compose.yml):
version: '3.8'
services:
api:
image: my-api-image
# API сможет подключиться к базе данных по адресу 'postgres-db:5432'
environment:
- DATABASE_URL=postgresql://user:password@postgres-db:5432/mydatabase
postgres-db:
image: postgres:13
environment:
- POSTGRES_USER=user
- POSTGRES_PASSWORD=password
- POSTGRES_DB=mydatabase
В этом примере сервис api найдет сервис postgres-db по его имени postgres-db без необходимости знать IP-адрес контейнера.
Ответ 18+ 🔞
А, ну это, классика, блядь! Docker Compose, сука, он такой хитрожопый, сам всё организует, как будто у него там свой маленький мирок под капотом.
Смотри, вот ты пишешь этот свой docker-compose.yml, а он, этот ёбаный композ, берёт и — хуяк! — создаёт одну общую сеть на всех, типа bridge. И все твои сервисы там, как соседи по коммуналке, друг друга по именам видят. Это называется автоматическое обнаружение сервисов, и это, блядь, офигенная штука, чтобы не ебаться с айпишниками.
- Как сеть зовут? А он её сам называет, мудя! По имени папки, где твой файл лежит. Типа
моя_папка_проекта_default. Хуй с горы, главное — работает. - Как они друг друга находят? Да элементарно, ёпта! По имени сервиса, которое ты в файле указал. Оно же становится именем хоста внутри сети. Хочешь к базе подключиться? Пиши в настройках не айпи, а просто имя сервиса —
postgres-db. И всё, пиздец, магия!
Вот смотри, как это выглядит в жизни (docker-compose.yml):
version: '3.8'
services:
api:
image: my-api-image
# API просто возьмёт и доёбется до базы по имени 'postgres-db:5432'. Никаких танцев с бубном!
environment:
- DATABASE_URL=postgresql://user:password@postgres-db:5432/mydatabase
postgres-db:
image: postgres:13
environment:
- POSTGRES_USER=user
- POSTGRES_PASSWORD=password
- POSTGRES_DB=mydatabase
Видишь? Сервис api тупо стучится на postgres-db:5432. И он его находит! Потому что они в одной сети, которую композ для них наколдовал. Красота, ёперный театр! Ничего самому городить не надо.