Понимание подключения портов docker compose для django, react app и haproxy

Я столкнулся с docker-compose.yml, который имеет следующую конфигурацию портов:

    wsgi: 
        ports: 
            - 9090  // ?? Is it by default mapped to host port 80 ??  

    nodejs 
            image: nodejs:myapp 
            ports: 
                - 9999:9999 
            environment: 
                BACKEND_API_URL: http://aa.bb.cc.dd:9854/api/ 

    haproxy 
        ports: 
            - 9854:80        

Я пытаюсь понять, как здесь происходит разводка портов.

В настройках приложения UI

nodejs необходимо указать порт бэкенда, который здесь 9854. Этот порт раскрывается настройками haproxy и сопоставляется с портом 80. Я знаю, что wsgi - это приложение django backend. Из его entrypoint.sh (в PS ниже) и спецификации порта в вышеприведенном docker-compose.yml, я понял, что django слушает порт 9090. Но я не могу понять, как этот порт 9090 сопоставляется с портом 80 (который затем выставляется haproxy в 9854, который в свою очередь указан в BACKEND_API_URL в настройках nodejs).

PS:

Django wsgi app имеет следующее в \wsgi\entrypoint.sh:

    nohup gunicorn myapp.wsgi --bind "0.0.0.0:9090" 

А приложение nodejs react имеет следующее в своем server.js файле:

    const port = process.env.PORT || 9999; 

На вашем хосте видны три порта:

  1. http://aa.bb.cc.dd:9854 перенаправляет на порт 80 на контейнере haproxy.
  2. http://aa.bb.cc.dd:9999 перенаправляет на порт 9999 на контейнере nodejs.
  3. Порт, показанный docker-compose port wsgi 9090, перенаправляет на порт 9090 на контейнере wsgi.

Вы вообще не обсуждаете конфигурацию HAProxy, но предположительно он настроен на прослушивание порта 80, и это может быть недостающий бит конфигурации, который вы ищете.

Между этими тремя контейнерами (которые не видны вашему внешнему приложению), при условии, что у вас нет блоков networks: в файле Compose, есть три очевидных URL: http://haproxy:80 (или просто http://haproxy), http://nodejs:9999 и http://wsgi:9090 подключаются к соответствующим контейнерам. Обратите внимание, что они используют "обычные" порты для своего сервиса, а не перемаппированный порт для haproxy или случайно выбранный порт для wsgi.

Предполагаю, что контейнер HAProxy настроен на выполнение своего рода маршрутизации на основе пути к одному или другому контейнеру. Если у вас есть такая настройка, вы можете настроить ваше приложение React так, чтобы оно вообще не включало имя хоста в URL (BACKEND_API_URL: /api/), что упростит его развертывание. Вам не нужны ports: для соединений между контейнерами, и если вы не хотите, чтобы вызывающая сторона могла обращаться к внутренним службам, не проходя через прокси, вы можете удалить их блоки ports:.

Вернуться на верх