Docker networks: сети контейнеров и взаимодействие сервисов - Компьюти
Logo КОМПЬЮТИ

Docker networks: сети контейнеров и взаимодействие сервисов

Время на прочтение: 2 мин.

Docker networks позволяют контейнерам взаимодействовать друг с другом и с внешней сетью.

В Docker Compose сервисы по умолчанию подключаются к общей сети проекта. Контейнеры могут находить друг друга по имени сервиса через встроенный DNS.

Например, если Compose-файл содержит сервисы app и postgres, приложение может подключаться к базе по адресу:

postgres:5432

IP-адрес базы указывать не нужно.

Зачем нужны Docker networks

Сети используются для:

  • связи приложения с базой данных;
  • связи Nginx с PHP;
  • подключения приложения к Redis;
  • изоляции сервисов;
  • разделения frontend и backend;
  • подключения нескольких Compose-проектов.

Список сетей

docker network ls

Создать сеть:

docker network create app-network

Информация:

docker network inspect app-network

Удалить:

docker network rm app-network

Подключение контейнера к сети

Создаем контейнер:

docker run -d \
  --name nginx \
  --network app-network \
  nginx

Другой контейнер в той же сети:

docker run --rm \
  --network app-network \
  curlimages/curl \
  http://nginx

Контейнер может обратиться к Nginx по имени nginx.

Docker Compose и сети

Простейший Compose-проект:

services:
  app:
    image: my-app

  postgres:
    image: postgres:18

Compose автоматически создает default network. Все сервисы подключаются к ней.

Собственная сеть

Можно определить сети явно:

services:
  app:
    image: my-app
    networks:
      - backend

  postgres:
    image: postgres:18
    networks:
      - backend

networks:
  backend:

Теперь оба сервиса находятся в сети backend.

Разделение frontend и backend

Более сложная архитектура:

services:
  nginx:
    image: nginx:alpine
    networks:
      - frontend
      - backend

  app:
    image: my-app
    networks:
      - backend

  postgres:
    image: postgres:18
    networks:
      - backend

networks:
  frontend:
  backend:

В этом случае Nginx подключен к двум сетям, а PostgreSQL — только к backend.

Это позволяет ограничить непосредственный доступ между сервисами.

Service discovery

В Compose сервисы доступны по именам.

Например:

services:
  web:
    image: my-app

  redis:
    image: redis:alpine

Приложение может использовать:

redis:6379

Вместо:

localhost:6379

Это важное правило Docker.

localhost внутри контейнера означает сам контейнер, а не хост и не соседний контейнер.

Почему нельзя использовать localhost

Допустим, приложение находится в контейнере app, а Redis — в redis.

Неправильно:

localhost:6379

Правильно:

redis:6379

Потому что localhost внутри app указывает на app.

Публикация портов

Сетевое взаимодействие между контейнерами не требует публикации порта наружу.

Например:

services:
  app:
    image: my-app

  postgres:
    image: postgres:18

PostgreSQL может быть доступен приложению внутри сети без:

ports:
  - "5432:5432"

Публиковать порт базы данных на интернет-хост без необходимости не стоит.

Проверка сети

Посмотреть сети:

docker network ls

Проверить конкретную:

docker network inspect project_default

Можно также войти в контейнер и проверить DNS/сетевое соединение.

Например:

docker compose exec app sh

Затем выполнить подходящую команду для проверки подключения к сервису.

Типичные проблемы

Контейнеры находятся в разных сетях

Тогда они не смогут нормально взаимодействовать через внутреннюю сеть.

Используется localhost

Это одна из самых распространенных ошибок.

Используется IP контейнера

IP может измениться после пересоздания контейнера. Лучше обращаться к сервису по имени.

База опубликована наружу без необходимости

Если PostgreSQL нужен только приложению, обычно достаточно внутренней сети.

Networks и Docker Compose

Сети особенно важны в многоконтейнерных проектах.

Например, стандартный стек веб-сайта может выглядеть так:

Internet
   |
 Nginx
   |
  App
 /   \
DB   Redis

Для такого проекта Compose позволяет создать несколько сетей и явно определить, какие сервисы имеют доступ друг к другу.

Читайте также:


Читайте также:

Приглашаем поучаствовать в обсуждении статьи:

Комментариев 0