docker compose 服务之间的连接被拒绝

问题描述 投票:0回答:1

我有一个 hello-world React 应用程序(前端)和一个 Flask api(后端),每个都位于 docker 容器内,我试图从前端向后端发出请求,但出现连接拒绝错误.

以下是与后端相关的相关文件:

应用程序.py

import random
from flask import Flask, jsonify

app = Flask(__name__)

@app.route('/get_data', methods=["GET"])
def get_data():
    return jsonify({'data': random.randint(0, 10)}), 200

if __name__ == '__main__':
    app.run(debug=True)

需求.txt

blinker==1.7.0
click==8.1.7
Flask==3.0.2
Flask-Cors==4.0.0
itsdangerous==2.1.2
Jinja2==3.1.3
MarkupSafe==2.1.5
Werkzeug==3.0.1

Dockerfile

FROM python:3.10-slim

COPY ./requirements.txt /app/requirements.txt

WORKDIR /app

EXPOSE 5000

RUN pip install -r requirements.txt

COPY ./app.py /app/app.py

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

以下是与前端相关的文件:

React 应用程序是用

npx create-react-app frontend

创建的 hello world

Dockerfile

FROM node:18
WORKDIR /test-front/

COPY public/ /test-front/public
COPY src/ /test-front/src
COPY package.json /test-front/

RUN npm install

CMD ["npm", "start"]

这是 docker compose 文件:

services:
  frontend:
    build: frontend/.
    ports:
      - "3000:3000"
    networks:
      - app
  backend:
    build: backend/.
    expose:
      - "5000"
    networks:
      - app

networks:
  app:
    driver: bridge

flask api 运行在端口 5000,react 应用程序运行在端口 3000。

前端应用程序正在使用 axios 向 http://backend:5000/get_data 发出请求,但现在我正在尝试使用容器控制台中的命令重现该问题。

问题是:我进入前端容器并尝试从后端向 /get_data 发出请求,但收到连接拒绝错误:

myPC$ docker exec -it test_docker-frontend-1 bash
container$ curl -v http://backend:5000/get_data

控制台输出:

*   Trying 172.20.0.3:5000...
* connect to 172.20.0.3 port 5000 failed: Connection refused
* Failed to connect to backend port 5000 after 1 ms: Couldn't connect to server
* Closing connection 0
curl: (7) Failed to connect to backend port 5000 after 1 ms: Couldn't connect to server

我应该怎么做才能从前端容器向后端容器发出请求?

我尝试暴露端口 5000 并在后端服务的端口部分添加“5000:5000”,但没有成功。前端应该能够向后端容器发出请求。

reactjs flask docker-compose
1个回答
0
投票

您需要指定 host 才能在 python 代码上公开。

if __name__ == '__main__':
    app.run(debug=True, host='0.0.0.0')
© www.soinside.com 2019 - 2024. All rights reserved.