Docker Compose
1Docker Compose: многоконтейнерные приложения2Volumes: хранение данных в Docker3Сети Docker Compose: как сервисы общаются← вы здесь
Урок 3~9 минут

Сети Docker Compose: как сервисы общаются

Каждый запуск docker compose up создаёт отдельную сеть. Сервисы внутри неё находят друг друга по имени.

Service Discovery

yaml
services:
  db:
    image: postgres:16-alpine
    environment:
      POSTGRES_PASSWORD: secret
 
  api:
    build: .
    environment:
      # Обращаемся к сервису "db" по его имени
      DATABASE_URL: postgres://postgres:secret@db:5432/myapp

Docker автоматически создаёт DNS-записи внутри сети Compose. db резолвится в IP контейнера с сервисом db. Не нужно знать IP — он меняется при каждом запуске.

Сети по умолчанию

Compose создаёт одну bridge-сеть для всех сервисов. Имя: <project>_default.

bash
docker network ls          # посмотреть все сети
docker network inspect myapp_default

Пользовательские сети

Для изоляции можно разделить сервисы по сетям:

yaml
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 (несколько хостов)
yaml
services:
  app:
    network_mode: host    # порты контейнера = порты хоста

Алиасы и внешние сети

yaml
services:
  db:
    networks:
      backend:
        aliases:
          - postgres      # доступен и как "db" и как "postgres"
 
networks:
  external-net:
    external: true        # сеть уже существует снаружи

Порты: внешние vs внутренние

yaml
services:
  api:
    ports:
      - "8000:8000"  # открыть для хоста
 
  db:
    # НЕТ ports — db доступна только внутри сети Compose
    # Это безопаснее!

Не открывай порты базы данных наружу без нужды. Внутри Compose-сети все порты доступны между сервисами — ports нужен только для доступа с хоста.

Отладка сети

bash
# Войти в контейнер и проверить
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.

В Compose сервисы находят друг друга по имени: db:5432, redis:6379. Изолированные сети — безопаснее.
🕸️
Docker сети: изоляция сервисов
Нажми на сервис, чтобы увидеть кто его видит
FRONTEND NETWORK
🌐
nginx
:80
api
:8000
BACKEND NETWORK
api
:8000
🐘
db
:5432
🔴
redis
:6379
nginx → api (frontend), api → db, redis (backend). nginx не видит db напрямую.
🎯
Миссия 1 из 3
Как api сервис может обратиться к сервису db в Docker Compose?