Урок 05 · Network

Сети тестового контура

Соедините test runner с frontend по Docker DNS и перестаньте использовать localhost как универсальный адрес.

Время: 20 минутРезультат: private test networkИнтервью: namespace и ports

Сначала адрес

Frontend и Playwright работают в разных containers одной Compose-сети. Какой URL должен открыть тест и почему?

Три разных точки зрения

Кто обращаетсяАдрес frontend
Process внутри frontend containerhttp://localhost:80
Другой container в общей networkhttp://frontend:80
Browser/process на Docker hosthttp://127.0.0.1:8080 при -p 127.0.0.1:8080:80
localhost всегда локаленВнутри test runner он указывает на сам test runner, а не на frontend, API или Docker host. Граница определяется network namespace процесса.

Практика: связь без host port

docker network create wms-test

docker run --detach --name frontend \
  --network wms-test \
  nginx:alpine

docker run --rm --network wms-test alpine:3.21 \
  wget -qO- http://frontend:80

Docker DNS разрешает имя frontend в IP container внутри user-defined network. Host port не нужен: запрос не выходит на host.

# С host запрос пока не работает: port не опубликован
curl --fail http://127.0.0.1:8080/

# Создаём другой container с явной публикацией
docker run --detach --name public-frontend \
  --publish 127.0.0.1:8080:80 \
  nginx:alpine

curl --fail http://127.0.0.1:8080/

Published port решает вход с host/внешней сети. Он не нужен для обычного service-to-service traffic внутри общей Docker network.

Диагностика сетевого сбоя

  1. Определить источник запроса: host или конкретный container.
  2. Проверить, подключены ли containers к одной network: docker network inspect.
  3. Проверить DNS-имя из source container.
  4. Проверить listen address/port процесса внутри target container.
  5. Только для входа с host проверить published address и port.
docker network inspect wms-test
docker exec frontend nginx -T
docker port public-frontend
docker logs frontend

Если приложение слушает только 127.0.0.1 внутри своего container, соседний service не подключится к нему по container IP. Для service traffic процесс обычно слушает 0.0.0.0 внутри container, а внешняя доступность ограничивается публикацией портов и сетями.

Безопасность публикации

-p 8080:80 без host address обычно публикует port на всех host interfaces. Для локального тестового сервиса безопаснее -p 127.0.0.1:8080:80. В Compose внутренние DB/API ports часто вообще не публикуются, если доступны только другим services.

docker rm --force frontend public-frontend
docker network rm wms-test

«Я сначала определяю network namespace клиента. Между Compose services использую service DNS и container port, например http://frontend:80. localhost внутри test runner указывает на него самого. Published port нужен для входа через host и задаётся как host:container; внутренние зависимости без необходимости наружу не публикую».

Проверка понимания

1. Как test container обращается к frontend?

2. Что даёт published port?

3. Что означает localhost внутри container?

Первичные источники

Для нестандартной topology нарисуйте источник, namespace и назначение и проверьте схему с преподавателем.