在docker-compose服务之间进行通讯时遇到问题

时间:2019-07-10 07:27:39

标签: docker docker-compose docker-networking

我有以下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(Python 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(用于api的测试react应用程序):

# 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。我已经尝试过以下网址的各种排列: http://scraper-api:80/api/test_api。他们都没有为我工作。

我一直在清理互联网,却找不到真正的解决方案。

2 个答案:

答案 0 :(得分:1)

React应用程序运行在最终用户的浏览器中,该浏览器根本不知道这种“ Docker”是存在的,也不知道任何Docker Compose网络设置。对于恰好由Docker托管的浏览器应用程序,需要将其配置为使用主机的 DNS名称或IP地址以及后端服务的已发布端口。

一个常见的设置(Docker或其他方式)是将浏览器应用程序和后端应用程序都放置在反向代理之后。在这种情况下,您可以使用不带主机名的相对URL,例如/api/...,它们将被解释为“相同的主机和端口”,从而完全绕开了这个问题。

答案 1 :(得分:0)

作为旁注:当在docker-compose.yml中未指定任何网络时,将使用以下名称[docker_compose.yml的目录位置] _default为您创建默认网络。例如,如果docker_compose.yml位于app文件夹中。该网络将被命名为app_default

现在,在此网络内,可以通过其服务名称访问容器。因此,scraper-api主机应解析为正确的容器。

可能是您使用了错误的端点URL。在问题中,您提到/api/top_10作为端点,但是要测试的URL是http://scraper-api:80/api/test_api,这是不一致的。

此外,可能是您混淆了scraper-api服务的docker-compose.yml端口的顺序:

ports:
   - "5000:80"

5000正暴露给运行docker的主机。 80是内部应用程序端口。通常,flask应用程序会监听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即可。