【问题标题】:How to connect two Docker containers running react and python如何连接两个运行 react 和 python 的 Docker 容器
【发布时间】:2020-05-16 21:28:40
【问题描述】:

我有 docker-compose.yml 来调出两个 docker 容器。

1.) 前端 - reactjs - 在端口 3000 上运行

2.) 后端 - python (flask) - 在端口 8083 上运行

前端正在调用 python 服务器以通过 url "http://127.0.0.1:8083/api 使用 axios 获取 POST 方法,但现在由于它们在两个容器上运行,我如何将前端连接到python 服务器通过那个 url?

这是我的docker-compose.yml

version: "3.2"

services:

  frontend:
    build: ./frontend
    environment:
      CHOKIDAR_USEPOLLING: "true"
    volumes:
      - /app/node_modules
      - ./frontend:/app
    ports:
      - 80:3000
    depends_on: 
      - backend

  backend: 
    build: ./backends/jananath
    volumes:
      - ./backends/jananath:/usr/src/app
    environment:
      FLASK_APP: /usr/src/app/server.py
      FLASK_DEBUG: 1
      FLASK_RUN_EXTRA_FILES: "/usr/src/app/banuka.txt"
    ports: 
      - 5000:8083

这是server.py python 服务器

from flask import Flask, render_template, request, url_for, redirect
import os
from os import path, walk
from flask_cors import CORS

app = Flask(__name__)
CORS(app)

PORT = 8083

@app.route('/api', methods=['POST', 'GET'])
def upload_file():
    file = request.files['file']
    filename = file.filename

    print(filename)

    filepath = os.path.abspath(filename)
    print(filepath)
    response_ = {}
    response_['filename'] = str(filename)
    response_['filepath'] = str(filepath)
    return response_


if __name__ == '__main__':
    app.run(host='0.0.0.0', port=PORT, extra_files=extra_files)

这是 axiosfront-end 调用 POST 方法到这个 server.py

const onFormSubmit = async (e) => {
    e.preventDefault();

    const formData = new FormData();
    formData.append("file", file);

    try {

      const res = await axios.post("http://127.0.0.1:8083/api", formData, { // this url should change now?
        headers: {
          "Content-Type": "multipart/form-data",
          "Access-Control-Allow-Credentials": "true",
          "crossorigin": "true",
        },
      });

      const {filename, filepath} = res.data;

      setUploadedFile({filename, filepath});
    } catch (error) {
      console.log(error);
    }
  };

我认为这里的问题是 URL 现在已更改,但我不知道如何解决。谁能告诉我如何解决这个问题以及我应该点击的正确 URL 是什么?

谢谢!

【问题讨论】:

  • React 应用程序通常运行在浏览器中,因此无法利用 Docker 网络。您需要使用运行容器的服务器的主机名;如果您在单个系统上运行这一切,那么您拥有的 127.0.0.1 实际上可能会正常工作。
  • @DavidMaze 这是在同一台主机上运行的。但是使用localhost:<port>/api 不起作用。但是当我在本地运行它时(不使用docker)它可以工作。
  • 您还需要来自ports: 的第一个端口号(您在Docker 之外发布的),所以127.0.0.1:5000

标签: python docker flask


【解决方案1】:

在你的 react 应用中尝试 backend:8083,你需要重建你的 react 镜像。

【讨论】:

  • backend 是什么意思?
  • backend 是您的容器名称,因为您将它们与depends_on 链接起来就足够了,否则您也可以通过映射到本地主机的端口进行外部通信,即点击localhost:5000 in你的反应应用程序。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-03-01
  • 1970-01-01
  • 2021-11-24
  • 2021-01-26
  • 2018-06-16
  • 2021-09-22
  • 2015-05-22
相关资源
最近更新 更多