Какой сетевой режим Docker Compose использует по умолчанию?

Ответ

По умолчанию Docker Compose создает для каждого проекта отдельную user-defined bridge network (пользовательскую мостовую сеть).

Почему именно bridge-сеть? Этот режим обеспечивает изоляцию сервисов проекта от других контейнеров на хосте, а также позволяет сервисам внутри проекта легко взаимодействовать друг с другом по их именам (DNS-резолвинг), без необходимости знать IP-адреса. Это значительно упрощает конфигурацию и масштабирование.

Пример конфигурации docker-compose.yml:

version: '3.8' # Рекомендуется использовать актуальную версию
services:
  web:
    image: nginx:latest
    ports:
      - "80:80"
    networks:
      - my_project_network # Явное указание сети (опционально, если сеть одна)
  db:
    image: postgres:13
    environment:
      POSTGRES_DB: mydatabase
      POSTGRES_USER: user
      POSTGRES_PASSWORD: password
    networks:
      - my_project_network

networks:
  my_project_network:
    driver: bridge # Явное определение сети, если нужно настроить ее параметры

Как это работает:

  • Если сеть не указана явно, Docker Compose автоматически создает сеть с именем <project_name>_default (где <project_name> — имя каталога, в котором находится docker-compose.yml).
  • Все сервисы, определенные в файле, автоматически подключаются к этой сети.
  • Сервисы могут обращаться друг к другу по их именам, указанным в services (например, web может подключиться к db по имени хоста db).

Основные преимущества user-defined bridge-сетей в Docker Compose:

  • Изоляция: Сервисы проекта изолированы от других контейнеров на хосте.
  • DNS-резолвинг: Сервисы могут находить друг друга по именам, что упрощает конфигурацию.
  • Портативность: Конфигурация сети описывается в docker-compose.yml и легко переносится.
  • Автоматическое подключение: Все сервисы в файле автоматически подключаются к созданной сети.

Ответ 18+ 🔞

А, слушай, смотри, вот эта вся хуйня с Docker Compose, она же не просто так, блядь! По умолчанию, когда ты запускаешь docker-compose up, он тебе на каждый проект создаёт свою собственную, ёпта, user-defined bridge network — ну, типа, мостовую сеть, сделанную пользователем, то есть тобой, через конфиг.

А нахуя она вообще, эта bridge-сеть, спросишь? А вот нахуя, блядь: она ж как клетка для хомяков, только для твоих сервисов. Изолирует их от остального зоопарка контейнеров на хосте, чтобы они там друг другу по портам не ебли мозг. Но при этом внутри этой клетки они могут общаться на раз-два, по именам, как по телефонной книжке! DNS-резолвинг, сука! Не надо запоминать эти ёбаные IP-адреса, которые меняются чаще, чем твоё настроение. Просто пишешь в коде "подключись к db" — и всё, пиздец, магия!

Вот смотри, как это в конфиге выглядит, простой пример, блядь:

version: '3.8' # Бери посвежее, не парься
services:
  web:
    image: nginx:latest
    ports:
      - "80:80"
    networks:
      - my_project_network # Можно явно указать, если хочешь поконтролировать
  db:
    image: postgres:13
    environment:
      POSTGRES_DB: mydatabase
      POSTGRES_USER: user
      POSTGRES_PASSWORD: password
    networks:
      - my_project_network

networks:
  my_project_network:
    driver: bridge # Так, явно говорим, что хотим мост. Хотя он и так по умолчанию bridge.

Как это, блядь, работает, в двух словах:

  • Если ты в конфиге нихуя не указал про сети, Compose сам, такой хитрожопый, создаст сеть с именем <имя_папки>_default. В рот меня чих-пых, удобно же!
  • Все сервисы из твоего файла автоматом в эту сеть залезут, как тараканы под плинтус.
  • И потом они там друг друга по именам находят! Веб-сервер web может спокойно стучаться к базе db просто по имени db. Красота, ёпта!

Ну и главные плюсы, блядь, этой всей системы:

  • Изоляция: Твой проект — твоя крепость. Другие контейнеры снаружи не пролезут, если ты не разрешишь.
  • DNS-резолвинг: Имена вместо цифр. Проще, блядь, некуда. Не надо быть гением, чтобы понять.
  • Портативность: Всё описано в одном docker-compose.yml файле. Скопировал папку — и всё, хуй с горы, проект готов к запуску на другой машине.
  • Автоматическое подключение: Не надо вручную сети создавать и контейнеры к ним привязывать. Написал конфиг, запустил — и похуй, всё само подцепилось. Волшебство, блядь, да и только!