Создает ли Docker Compose сеть по умолчанию для сервисов

Ответ

Да, по умолчанию 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. И он его находит! Потому что они в одной сети, которую композ для них наколдовал. Красота, ёперный театр! Ничего самому городить не надо.