【问题标题】:Connect multiple docker containers (docker-compose) - front -> api -> solr连接多个 docker 容器(docker-compose) - front -> api -> solr
【发布时间】:2021-01-05 12:00:37
【问题描述】:

我想连接多个 docker 容器。我有 3 项服务:

  • solr 存储文档并返回查询结果
  • Flask 后端查询 solr
  • 将前端请求响应到烧瓶后端以获取 solr 结果并使用 fetch 显示在页面上

我能够创建后端来查询 solr 并在将 url 放入浏览器时显示结果。但是,我无法使用 fetch 从前端代码中使用该端点。我还可以查询另一个后端端点,但它只是一个虚拟端点,返回“hello world” - 所以我怀疑问题出在 3 个容器之间的连接上(因为后端连接到 solr,但前端不能连接到它上面)。

我的 docekr-compose.yml 文件:

version: '3.8'

services:
    api-service:
        build: api
        volumes:
            - ./api/:/backend
        environment:
            - FLASK_ENV=development
            - FLASK_APP=app.py
        ports:
            - "5000:5000"
        networks:
            - solr
        depends_on:
            - solr
        links:
            - solr
    front:
        build: front
        volumes:
            - ./front:/frontend
            - node-modules:/frontend/node_modules
        environment:
            - NODE_ENV=development
        ports:
            - "3000:3000"
        depends_on:
            - api-service
        links:
            - api-service
            - solr
    solr:
        image: solr:8.5
        container_name: solr
        ports:
            - "8983:8983"
        networks:
            - solr
        command:
            - solr-precreate
            - gettingstarted
volumes:
    node-modules:

networks:
  solr:

我连接到 Solr 的 Flask 代码:

BASE_PATH='http://solr:8983/solr/gettingstarted/select?q=%2A:%2A'
@app.route('/myquery', methods=['GET', 'POST'])
def my_query_solr():
    connection = urlopen("{}".format(BASE_PATH))
    response = simplejson.load(connection)

    return response

我的 js 代码到达 Flask 端点:

submitHandler = (e) => {
    e.preventDefault();
    fetch("http://localhost:5000/myquery/")
      .then(res => res.json())
      .then(
        (result) => {console.log(result["response"]["docs"])},
        (error) => {
          this.setState({
            isLoaded: true,
            error,
          });
        }
      )
    }

我尝试使用 api:5000/myquery 或 solr:5000/myquery 代替 localhost:5000/myquery,但两者都不起作用 - 当我在浏览器中检查元素时,我得到 ERR_NAME_NOT_RESOLVED 或 404。我在这里读了几个线程。我能够基于此解决我之前的问题(它在 api 和 solr 之间连接 - 我使用 docker-compose.yml 中的链接修复了它),但现在我正在通过前端使用它。

【问题讨论】:

  • 浏览器应用程序永远不能使用 Docker 内部的主机名;在开发环境中http://localhost:5000/myquery 是最有可能的 URL。您是否在 Flask 日志中看到匹配的请求?
  • 嗨@DavidMaze,当我尝试从 React 查询 localhost:5000/myquery 时,我得到“api-service_1 | 192.168.112.1 - - [05/Jan/2021 12:04:41]” GET /myquery/ HTTP/1.1" 404 -" 在日志中。当我查询 localhost:5000/hello 时(这是一个只返回“hello world”的虚拟 Flask 端点,它可以工作)。
  • 你有@app.route('/myquery'),后面没有/。将路由更改为带有斜杠,或从 URL 末尾删除斜杠是否会有所不同?如果 Flask 报告 404 错误,那么所有 Docker 级别的接线都是正确的。
  • 解决了这个问题!非常感谢@DavidMaze,我已经尝试解决这个问题好几个小时了......

标签: docker docker-compose containers connect


【解决方案1】:

正如 DavidMaze 所建议的,这归结为在 @app.route('/myquery') 中没有训练 / 并将其放在 fetch("http://localhost:5000/myquery/") 中。从 fetch 中删除培训 / 有帮助。

【讨论】:

    猜你喜欢
    • 2021-01-26
    • 2020-01-06
    • 2019-04-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-06-04
    相关资源
    最近更新 更多