Как отправлять запросы от одного сервиса к другому в docker swarm?
Мне нужен совет по поводу архитектуры docker swarm.
У меня есть 2 узла, менеджер и рабочий. В моем рое есть 3 копии моего бэкенда (Django), 3 копии моего фронтенда (React) и 1 база данных PostgreSQL. У меня нет ни nginx, ни traefik, ни чего-либо еще, кроме этого.
По какой-то причине маршрутизация не работает. Отправка POST-запросов с моего фронтенда на мой бэкенд возвращает ERR_NAME_NOT_RESOLVED. Я попробовал получить http://my_backend_service_name:8000/, полагаясь на то, что рой выполнит балансировку нагрузки. Я уверен, что я что-то упускаю, но из всего, что я прочитал, я понял, что это должно быть возможно без traefik, nginx или чего-то еще. Вот мой файл стека docker compose:
services:
frontend:
image: xxxxxx
command: npm start
ports:
- "3000:3000"
stdin_open: true
networks:
- web_network
env_file: xxxxx
deploy:
replicas: 3
restart_policy:
condition: on-failure
db:
image: postgres:11
ports:
- "5432:5432"
command: "-c logging_collector=on"
volumes:
- ./database/postgres_data:/var/lib/postgresql/data/
networks:
- data_network
environment:
- POSTGRES_USER=xxxxx
- POSTGRES_PASSWORD=xxxxx
- POSTGRES_DB=xxxx
deploy:
placement:
constraints:
- "node.role==manager"
restart_policy:
condition: on-failure
delay: 5s
max_attempts: 3
window: 120s
web:
image: xxxxx
depends_on:
db:
condition: service_started
command: bash -c "python manage.py makemigrations && python manage.py migrate && python manage.py runserver 0.0.0.0:8000"
ports:
- 8000:8000
env_file:
- xxxxx
volumes:
- migrations-volume:/elpaso/api/migrations/
deploy:
replicas: 3
restart_policy:
condition: on-failure
networks:
- web_network
- data_network
networks:
web_network:
driver: overlay
data_network:
driver: overlay
volumes:
migrations-volume:
Если у кого-нибудь есть информация или совет о том, как я могу отправить запросы от моего backend контейнера к frontend контейнеру, я буду очень, очень благодарен!
Ваше приложение react front end работает в браузере. Предполагая, что ваш рой имеет dns-запись "swarm.example.com", вы можете получить доступ к своему сайту с рабочего стола, используя "http://swarm.example.com:3000".
В следующем коде networks: web_network совершенно излишне, поскольку react не делает вызовов от сервера к серверу, а от клиента (т.е. браузера) к серверу, поэтому вам нужно научить приложение react тому, что "http://swarm.example.com:8000" - это правильный базовый url api. Вам нужно добавить это в качестве переменной окружения и/или убедиться, что приложение react может обрабатывать переменные окружения во время выполнения.
frontend:
image: xxxxxx
command: npm start
ports:
- "3000:3000"
stdin_open: true
# remove this
networks:
- web_network
# add something like this with an variable and node name appropriate to your environment
environment:
MY_API_URL: http://swarm:8000
env_file: xxxxx
deploy:
replicas: 3
restart_policy:
condition: on-failure