我有一个 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”,但没有成功。前端应该能够向后端容器发出请求。
您需要指定 host 才能在 python 代码上公开。
if __name__ == '__main__':
app.run(debug=True, host='0.0.0.0')