Создает ли дефолтные сети Docker Compose
Комментарии (1)
Ответ сгенерирован нейросетью и может содержать ошибки
Создание дефолтных сетей 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 адресами.