← Назад к вопросам

Создает ли дефолтные сети Docker Compose

2.0 Middle🔥 91 комментариев
#DevOps и инфраструктура

Комментарии (1)

🐱
claude-haiku-4.5PrepBro AI22 мар. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Создание дефолтных сетей Docker Compose

Да, Docker Compose автоматически создаёт дефолтную сеть для всех сервисов. Это один из удобных механизмов, который я использую в разработке. Разберусь подробнее.

Как Compose создаёт сеть

Когда вы запускаете docker compose up, Docker Compose автоматически создаёт мостовую сеть (bridge network) с названием <project_name>_default. Все контейнеры в этой сети могут общаться друг с другом по имени сервиса.

# docker-compose.yml
version: 3.8

services:
  web:
    image: nginx:latest
    ports:
      - "80:80"
  
  db:
    image: postgres:14
    environment:
      POSTGRES_PASSWORD: password

При запуске:

docker compose up

Compose создаст сеть <project_name>_default и подключит оба контейнера. Можно проверить:

docker network ls
# NAME                      DRIVER    SCOPE
# project_default           bridge    local

docker network inspect project_default
# Увидишь оба контейнера в "Containers"

Service Discovery

Важная особенность: контейнеры могут общаться по имени сервиса. Например, Python приложение может подключиться к PostgreSQL:

# Python код в контейнере web
import psycopg2

conn = psycopg2.connect(
    host="db",  # Используем имя сервиса, не IP
    user="postgres",
    password="password",
    database="mydb"
)

Докер автоматически разрешает имя db в IP контейнера PostgreSQL. Это работает благодаря встроенному DNS resolver в сети.

Явное определение сетей

Если нужна более сложная архитектура (несколько сетей), можно определить их явно:

version: 3.8

services:
  web:
    image: nginx
    networks:
      - frontend
  
  api:
    image: python:3.11
    networks:
      - frontend
      - backend
  
  db:
    image: postgres
    networks:
      - backend

networks:
  frontend:
    driver: bridge
  backend:
    driver: bridge

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

  • web и api общаются через frontend сеть
  • api и db общаются через backend сеть
  • web НЕ может напрямую обращаться к db (нет общей сети)

Это полезно для разделения concerns и улучшения безопасности.

Типы сетей в Docker

Bridge (мостовая) — по умолчанию для Compose. Контейнеры подключены к хост-машине через виртуальный мост:

brctl show  # Посмотреть мосты на Linux

Host — контейнер использует сетевой стек хоста напрямую. Быстрее, но менее изолировано:

services:
  web:
    image: nginx
    network_mode: "host"

None — контейнер без сети (изолирован):

services:
  isolated:
    image: ubuntu
    network_mode: "none"

Проброс портов

Средстве Compose может пробросить порты наружу:

services:
  web:
    image: nginx
    ports:
      - "8080:80"  # хост:контейнер

Теперь снаружи контейнер доступен на localhost:8080, но из других контейнеров — по имени web на порт 80.

DNS разрешение

В сети Compose каждый сервис имеет несколько имён:

db              # Имя сервиса
db.project_default   # FQDN (fully qualified domain name)

Можно использовать оба:

# Оба работают
psycopg2.connect(host="db", ...)
psycopg2.connect(host="db.project_default", ...)

Практический пример (реальный проект)

version: 3.8

services:
  web:
    build: .
    ports:
      - "8000:8000"
    environment:
      DATABASE_URL: postgresql://user:pass@db:5432/mydb
      REDIS_URL: redis://cache:6379/0
    depends_on:
      - db
      - cache
    networks:
      - app-network
  
  db:
    image: postgres:14
    environment:
      POSTGRES_PASSWORD: password
      POSTGRES_DB: mydb
    volumes:
      - postgres_data:/var/lib/postgresql/data
    networks:
      - app-network
  
  cache:
    image: redis:7-alpine
    networks:
      - app-network

networks:
  app-network:
    driver: bridge

volumes:
  postgres_data:

Здесь:

  • web может обращаться к db по db:5432 и cache по cache:6379
  • Все контейнеры находятся в одной логической app-network
  • Порты пробросаны только для web (чтобы снаружи можно было обратиться)

Важные моменты

Сеть создаётся при первом запуске — если её удалить вручную, Compose пересоздаст её.

Имена контейнеров — в одной сети могут быть контейнеры с одинаковыми именами сервисов из разных проектов, но они не будут конфликтовать (разные сети).

Масштабирование — если масштабировать сервис (несколько реплик), DNS будет распределять запросы между ними.

Выводы: дефолтная сеть Compose — мощный механизм, который упрощает разработку. Service discovery по имени сервиса избавляет от необходимости вручную управлять IP адресами.

Создает ли дефолтные сети Docker Compose | PrepBro