Как отправлять запросы от одного сервиса к другому в 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
Вернуться на верх