【问题标题】:Having trouble communicating between docker-compose services在 docker-compose 服务之间进行通信时遇到问题
【发布时间】:2019-11-20 23:51:45
【问题描述】:

我有以下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's:

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

我一直在搜索互联网,但我真的找不到解决方案。

【问题讨论】:

标签: docker docker-compose docker-networking


【解决方案1】:

React 应用程序在最终用户的浏览器中运行,它根本不知道这个“Docker”东西的存在,也不知道任何 Docker Compose 网络设置。对于碰巧托管在 Docker 之外的浏览器应用程序,它们需要配置为使用 主机的 DNS 名称或 IP 地址,以及后端服务的已发布端口。

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

【讨论】:

  • 感谢您的回复!我按照你告诉我的去做,它奏效了:)
【解决方案2】:

附带说明:当 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,这是不一致的。

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

ports:
   - "5000:80"

5000 被暴露给运行 docker 的主机。 80 是内部应用程序端口。通常,flask 应用程序正在监听 5000,所以我想你可能是想说:

ports:
   - "80:5000"

在这种情况下,在容器之间,您必须使用 :5000 作为 URL 中的目标端口:以 http://scraper-api:5000 为例(当然是 + 端点后缀)。

要检查连接,您可能需要 bash 进入客户端容器,并查看是否有连接:

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

等等

如果你得到响应,那么你有连接,只需要找出正确的端点 URL。

【讨论】:

    猜你喜欢
    • 2020-09-04
    • 1970-01-01
    • 2022-01-13
    • 1970-01-01
    • 2019-07-24
    • 2020-05-29
    • 1970-01-01
    • 2019-07-12
    相关资源
    最近更新 更多