Возникли проблемы при связи между сервисами docker-compose - PullRequest
0 голосов
/ 10 июля 2019

У меня есть следующий docker-compose файл:

version: "3"

services:
  scraper-api:
    build: ./ATPScraper
    volumes:
      - ./ATPScraper:/usr/src/app
    ports:
      - "5000:80"
  test-app:
    build: ./test-app
    volumes:
      - "./test-app:/app"
      - "/app/node_modules"
    ports:
      - "3001:3000"
    environment:
      - NODE_ENV=development
    depends_on:
      - scraper-api

Которые строят следующие Dockerfile:

scraper-api (приложение на питоне flask):

FROM python:3.7.3-alpine

WORKDIR /usr/src/app

COPY requirements.txt ./

RUN pip install --no-cache-dir -r requirements.txt

COPY . .

CMD ["python", "./app.py"]

test-app (тест react заявка на API):

# base image
FROM node:12.2.0-alpine

# set working directory
WORKDIR /app

# add `/app/node_modules/.bin` to $PATH
ENV PATH /app/node_modules/.bin:/app/src/node_modules/.bin:$PATH

# install and cache app dependencies
COPY package.json /app/package.json
RUN npm install --silent
RUN npm install react-scripts@3.0.1 -g --silent
RUN npm install axios -g

# start app
CMD ["npm", "start"]

Правда, я новичок, когда дело доходит до сетей Docker, но я пытаюсь заставить приложение react взаимодействовать с scraper-api. Например, scraper-api имеет следующую конечную точку: /api/top_10. Я пробовал различные перестановки следующих URL: http://scraper-api:80/api/test_api. Никто из них не работал на меня.

Я копался в Интернете и не могу найти решение.

Ответы [ 2 ]

1 голос
/ 10 июля 2019

Приложение React запускается в браузере конечного пользователя, который не подозревает, что эта «Docker» вообще существует, и не знает ни о какой сетевой настройке Docker Compose.Для приложений браузера, которые размещаются вне Docker, их необходимо настроить на использование имени или IP-адреса хоста *1001* хоста и опубликованного порта серверной службы.

Обычная настройка (Docker или иным образом) заключается в размещении приложений браузера и фонового приложения за обратным прокси-сервером.В этом случае вы можете использовать относительные URL-адреса без имен хостов, например /api/..., и они будут интерпретироваться как «тот же хост и порт», что полностью обходит эту проблему.

0 голосов
/ 10 июля 2019

Примечание: если в docker-compose.yml сеть не указана, для вас будет создана сеть по умолчанию со следующим именем [dir location of docker_compose.yml] _default.Например, если docker_compose.yml находится в папке app.сеть будет называться app_default.

Теперь внутри этой сети контейнеры доступны по именам своих служб.Таким образом, scraper-api хост должен разрешиться в нужный контейнер.

Возможно, вы используете неправильный URL-адрес конечной точки.В этом вопросе вы упомянули /api/top_10 в качестве конечной точки, но URL для проверки был http://scraper-api:80/api/test_api, что является несовместимым.

Кроме того, возможно, вы перепутали порядок портов в docker-compose.ymlдля scraper-api службы:

ports:
   - "5000:80"

5000 предоставляется хосту, на котором работает докер.80 - это внутренний порт приложения.Обычно флеш-приложения прослушивают 5000, поэтому я подумал, что вы могли бы сказать:

ports:
   - "80:5000"

В этом случае между контейнерами вы должны использовать :5000 в качестве порта назначения в URL: http://scraper-api:5000в качестве примера (+ суффикс конечной точки, конечно).

Чтобы проверить подключение, вы можете захотеть подключиться к клиентскому контейнеру и посмотреть, подключаются ли вещи:

docker-compose exec test-app bash
wget http://scraper-api
wget http://scraper-api:5000

и т. д.

Если вы получили ответ, значит, у вас есть возможность подключения, просто нужно определить правильный URL-адрес конечной точки.

...