Сети Docker Compose: как сервисы общаются
Каждый запуск docker compose up создаёт отдельную сеть. Сервисы внутри неё находят друг друга по имени.
Service Discovery
services:
db:
image: postgres:16-alpine
environment:
POSTGRES_PASSWORD: secret
api:
build: .
environment:
# Обращаемся к сервису "db" по его имени
DATABASE_URL: postgres://postgres:secret@db:5432/myappDocker автоматически создаёт DNS-записи внутри сети Compose. db резолвится в IP контейнера с сервисом db. Не нужно знать IP — он меняется при каждом запуске.
Сети по умолчанию
Compose создаёт одну bridge-сеть для всех сервисов. Имя: <project>_default.
docker network ls # посмотреть все сети
docker network inspect myapp_defaultПользовательские сети
Для изоляции можно разделить сервисы по сетям:
services:
nginx:
image: nginx:alpine
networks:
- frontend
ports:
- "80:80"
api:
build: .
networks:
- frontend
- backend
db:
image: postgres:16-alpine
networks:
- backend # только backend — nginx не видит db
networks:
frontend:
backend:Nginx может обращаться к api (общая сеть frontend). Api обращается к db (общая сеть backend). Nginx не может напрямую обратиться к db — разные сети.
Попробуй в симуляции
Типы сетей Docker
| Тип | Описание |
|---|---|
| bridge | По умолчанию. Изолированная сеть на хосте |
| host | Использует сетевой стек хоста напрямую |
| none | Без сети, только loopback |
| overlay | Для Docker Swarm (несколько хостов) |
services:
app:
network_mode: host # порты контейнера = порты хостаАлиасы и внешние сети
services:
db:
networks:
backend:
aliases:
- postgres # доступен и как "db" и как "postgres"
networks:
external-net:
external: true # сеть уже существует снаружиПорты: внешние vs внутренние
services:
api:
ports:
- "8000:8000" # открыть для хоста
db:
# НЕТ ports — db доступна только внутри сети Compose
# Это безопаснее!Не открывай порты базы данных наружу без нужды. Внутри Compose-сети все порты доступны между сервисами — ports нужен только для доступа с хоста.
Отладка сети
# Войти в контейнер и проверить
docker compose exec api sh
ping db # ping по имени сервиса
curl http://db:5432 # проверить достижимость
# На хосте
docker network inspect myapp_default
docker network inspect myapp_backendВ следующем модуле — продвинутый Docker: volumes в деталях, сети, Docker Hub и основы Swarm.