Понимание подключения портов 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
Я пытаюсь понять, как здесь происходит разводка портов.
В настройках приложения UInodejs
необходимо указать порт бэкенда, который здесь 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;
На вашем хосте видны три порта:
http://aa.bb.cc.dd:9854
перенаправляет на порт 80 на контейнереhaproxy
.http://aa.bb.cc.dd:9999
перенаправляет на порт 9999 на контейнереnodejs
.- Порт, показанный
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:
.