Нарисовать путь запроса
Перед правкой конфигурации выпишите цепочку: клиент → порт хоста → прокси → приложение. Для каждой стрелки укажите адрес и порт назначения. Это быстро обнаруживает ситуацию, когда прокси ищет приложение у себя.
Общая сеть для сервисов
В пользовательской bridge-сети контейнеры могут обращаться друг к другу по имени. Например, прокси и приложение в одной сети могут использовать адрес app:3000, если app — имя доступного там контейнера или сетевой псевдоним. Приложение при этом должно слушать интерфейс, доступный из этой сети.
Порт контейнера и порт хоста
Публикация порта связывает порт хоста с портом контейнера. Она нужна для доступа через хост, но не обязательна для связи контейнеров в общей сети. Если порт публикуется без адреса привязки, он по умолчанию доступен на всех интерфейсах хоста.
Проверьте фактическую схему, прежде чем добавлять очередной проброс:
docker network ls
docker network inspect app-net
docker port appapp-net и app — примеры имён. Подставьте свои сеть и контейнер. Режим host — отдельный случай: контейнер разделяет сетевое пространство хоста.
Документация
Сети, драйверы и опубликованные порты: Docker Networking overview.
Адрес имеет смысл только вместе с точкой, из которой к нему обращаются.