Докер: http-запросы из контейнера в другой зависли - PullRequest
0 голосов
/ 22 февраля 2019

Я использую VPS для тестирования своих веб-приложений в Интернете.И я использую Docker для запуска многих веб-приложений на одном сервере.Вот мой

docker-compose.yml

version: "3.7"

services:

  gateway:
    build:
      context: ./gateway
      dockerfile: Dockerfile
    restart: always
    ports:
      - 80:3000
    networks:
      erealm:
        ipv4_address: 10.5.0.2

  db:
    image: mysql/mysql-server:5.5
    restart: always
    environment:
      MYSQL_ROOT_PASSWORD: 4lf483t0
    networks:
      erealm:
        ipv4_address: 10.5.0.3

  phpmyadmin:
    image: nazarpc/phpmyadmin:latest
    environment:
      - MYSQL_HOST=10.5.0.3:3306
    restart: always
    depends_on:
      - db
    ports:
      - 1234:80
    networks:
      erealm:
        ipv4_address: 10.5.0.4

  static:
    build:
      context: ./static
      dockerfile: Dockerfile
    restart: always
    networks:
      erealm:
        ipv4_address: 10.5.0.5

  onlinecv:
    build:
      context: ./onlinecv
      dockerfile: Dockerfile
    restart: always
    ports:
      - 81:3000
    networks:
      erealm:
        ipv4_address: 10.5.0.10

  speeqapi:
    build:
      context: ./speeq/api
      dockerfile: Dockerfile
    restart: always
    environment:
      MYSQL_SERVER: 10.5.0.3
      MYSQL_PORT: 3306
      MYSQL_USER: xxxxxxxxxx
      MYSQL_PASSWORD: xxxxxxxxxx
      MYSQL_DATABASE: xxxxxxxxxx
    depends_on:
      - db
    networks:
      erealm:
        ipv4_address: 10.5.0.20

  speeqfe:
    build:
      context: ./speeq/fe
      dockerfile: Dockerfile
    restart: always
    environment:
      REACT_APP_API_SERVER: 10.5.0.20:3000
      REACT_APP_STATIC_SERVER: 10.5.0.5:3000
    ports:
      - 82:3000
    depends_on:
      - db
      - static
      - speeqapi
    networks:
      erealm:
        ipv4_address: 10.5.0.21

networks:
  erealm:
    driver: bridge
    ipam:
      config:
        - subnet: 10.5.0.0/24

Основная идея этой схемы - открытые миру только HTTP-порты, в то время как все необходимые службы работают под защитой внутренней сети Docker,недоступный для внешнего мира.

Я использую службу шлюза для сопоставления HTTP-запросов, поступающих для разных приложений, с разными портами.Итак, мое онлайн-резюме сопоставлено с CNAME cv.eddealmeida.net, а это приложение Speeq сопоставлено с CNAME speeq.eddealmeida.net в моей DNS-зоне, оба указывают на этот сервер.Когда мой сервер получает запрос к http://cv.eddealmeida.net или http://speeq.eddealmeida.net,, приложение шлюза на основе Node / Express (прослушивающее порт 80) разбивает параметры HOST запроса и применяет простое сопоставление для отправки запросовна порты 81 и 82 соответственно.

Ну, все работает нормально, но для внутренних запросов.Сначала у меня была проблема с внутренним разрешением имен, которую я решил, предоставив IP-адреса всем службам, как вы можете видеть.

Теперь мои внутренние запросы отправляются в правильные места, но ... запросы на выборку сделаныпо интерфейсу торчат.Они просто продолжают останавливаться снова и снова.Я протестировал API, используя curl, и все в порядке, он правильно отображает мои запросы командной строки.Таким образом, нет проблем с моим соединением API / базы данных или чем-то в этом роде.Google Chrome дал мне это объяснение , но я не вижу, чтобы я подходил в любом из упомянутых случаев.

Кто-нибудь когда-либо жил в такой ситуации, чтобы дать мне подсказку?Я боролся с этим в течение последних 24 часов и иссякли идеи.Я дважды проверил все, и он все равно не будет работать.

1 Ответ

0 голосов
/ 26 февраля 2019

У меня есть несколько предположений, которые могут помочь.

1- В отношении использования IP-адресов я бы предложил использовать псевдонимы сети вместо IP-адресов, и это долгосрочное решение

2 - Я вижу, что вы используете ReactJS в качестве клиентской части - я предполагаю, что вы используете статические файлы после сборки приложения React - в этом случае вам нужно выставитьbackend / api к общедоступному ip через сопоставление портов или использование доменного имени указывает на публичный ip, где ваш api прослушивает или любой другой подобный метод, чтобы интерфейсное приложение могло получить доступ к нему, когда вы открываете его из браузера (которыйдругое устройство в вашем случае).Так что, если speeqfe является интерфейсомactjs, вам нужно изменить значение переменных среды, которое указывает на другие контейнеры, на публичный ip, чтобы он работал должным образом после создания статических файлов

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...