Сначала адрес
Frontend и Playwright работают в разных containers одной Compose-сети. Какой URL должен открыть тест и почему?
Три разных точки зрения
| Кто обращается | Адрес frontend |
|---|---|
| Process внутри frontend container | http://localhost:80 |
| Другой container в общей network | http://frontend:80 |
| Browser/process на Docker host | http://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:80Docker 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.
Диагностика сетевого сбоя
- Определить источник запроса: host или конкретный container.
- Проверить, подключены ли containers к одной network:
docker network inspect. - Проверить DNS-имя из source container.
- Проверить listen address/port процесса внутри target container.
- Только для входа с 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; внутренние зависимости без необходимости наружу не публикую».
Проверка понимания
Первичные источники
- Docker networking overview — network namespace, DNS и connectivity.
- Port publishing and mapping — семантика и риски
-p. - Networking in Compose — service names и container ports.
Для нестандартной topology нарисуйте источник, namespace и назначение и проверьте схему с преподавателем.