Пользовательский интерфейс не может получить доступ к серверу Node при запуске в Docker и обслуживании через IP

Это моя ситуация.
Контейнеры Docker

1. Node/Play/Any BackEnd Server
2. React
3. Other services

Я запустил их с помощью docker-compose, и все работает нормально. Проблема в следующем:
когда я запускаю docker-compose на виртуальной машине и обслуживаю пользовательский интерфейс по IP-адресу, он не может получить доступ к серверу узла.

Это происходит потому, что код React настроен на доступ к серверу Node по адресу http://node-backend:9000 (где node-backend — это имя контейнера докеров, на котором работает nodejs), и реакция отправляет этот точный URL-адрес клиенту на какой-либо другой машине, которая не может разрешить этот адрес, поскольку http://node-backend:9000 является внутренним для Docker.

Как решить эту проблему без использования nginx или любого другого прокси-сервиса?


person asds_asds    schedule 19.03.2021    source источник
comment
На самом деле я бы рекомендовал добавить в этот стек обратный прокси-сервер Nginx; см., например, Docker Nginx Proxy: как направить трафик в другой контейнер, используя путь, а не имя хоста для вдохновения. Как только вы это сделаете, вы можете настроить внутренний URL-адрес в приложении React на относительный URL-адрес только для пути, например /api, и ему будет все равно, на каком хосте / порте он развернут.   -  person David Maze    schedule 19.03.2021


Ответы (1)


Вы должны изменить конфигурацию React. Никогда не используйте имя локального контейнера, если вы хотите работать с сервером по сети.

Вот шаги, которые вам нужно предпринять

  1. Сопоставление портов для узлового сервера. Вы, вероятно, уже делаете это.
  2. Убедитесь, что порт 9000 на сервере открыт.
  3. Настройте приложение реакции на использование IP-адреса для подключения к серверу узла (НЕ именованному экземпляру).
  4. На этом этапе вы должны увидеть вызовы, происходящие по сети, например http://:9000.
person kvp2982    schedule 19.03.2021
comment
Как сделать шаг 3? Прямо сейчас общедоступный IP-адрес меняется всякий раз, когда виртуальная машина перезапускается. Я не хочу нигде настраивать этот IP-адрес, этот адрес должен знать только конечный пользователь. - person asds_asds; 19.03.2021
comment
Если ip-адрес меняется каждый раз, вот два способа решения. В зависимости от вашего случая вы можете использовать любой подход. 1. Вы можете использовать DNS-имя или имя машины (оно не должно меняться каждый раз) вместо ее IP-адреса. 2. Если приложение React и сервер Node находятся на одном сервере, вы можете настроить приложение React на использование IP-адреса «хоста» приложения React и создать URL-адрес с номером порта сервера узла. - person kvp2982; 20.03.2021
comment
2 звучит отлично, как мне это сделать? - person asds_asds; 22.03.2021
comment
Используйте window.location.host, чтобы получить IP-адрес хоста. Создайте URL-адрес узла на основе этого. w3schools.com/js/js_window_location.asp - person kvp2982; 23.03.2021