我试图在一个单独的容器中获得一个基本的Flask后端和前端框架,这些容器通过docker-compose相互通信。
这里的警告是我正在使用Windows 10 Home,因此我需要使用Docker Toolbox,因此我不得不添加一些网络规则以进行端口转发。但是,我似乎无法访问我的后端的http://localhost:5000。我得到ECONNREFUSED。我只是想获得前端和后端通信之间的基本通信,以模拟前端/ api通信。
根据我的端口转发规则,我可以访问http://localhost:8080,并且可以查看应用程序的静态部分。但是,我无法访问后端,也不能告诉他们是否正在通信。 Flask和Docker都是新手,请原谅我的无知。来自.NET背景,Windows似乎确实使这很痛苦。谢谢您的帮助。
这是我的项目结构:
这是我的应用程序。py:
# Start with a basic flask app webpage.
from flask_socketio import SocketIO, emit
from flask import Flask, render_template, url_for, copy_current_request_context
app = Flask(__name__)
app.config['SECRET_KEY'] = 'secret!'
app.config['DEBUG'] = True
#turn the flask app into a socketio app
socketio = SocketIO(app)
@app.route('/')
def index():
#only by sending this page first will the client be connected to the socketio instance
return render_template('index.html')
if __name__ == '__main__':
socketio.run(app)
后端的Dockerfile:
FROM python:2.7
ADD ./requirements.txt /backend/requirements.txt
WORKDIR /backend
RUN pip install -r requirements.txt
ADD . /backend
ENTRYPOINT ["python"]
CMD ["/backend/application.py"]
EXPOSE 5000
用于前端的Dockerfile:
FROM node:latest
COPY . /src
WORKDIR /src
RUN npm install --loglevel warn
RUN npm run production
EXPOSE 8080
CMD [ "node", "server.js" ]
还有我的docker-compose.yml:
version: '2'
services:
backend:
build:
context: ./backend
dockerfile: Dockerfile
restart: always
ports:
- "5000:5000"
env_file:
- .env
frontend:
build: ./frontend
ports:
- "8080:8080"
答案 0 :(得分:1)
您与Flask配置有关的问题,只要在尝试连接时遇到此错误ECONNREFUSED
,就意味着您尝试使用的ip在端口5000上没有运行服务,这是因为此功能{ {1}}默认为127.0.0.1,它将是容器本身内部的本地主机。为了使您的应用程序可以从容器外部或通过容器ip进行访问,通常必须将另一个参数传递给名为socketio.run(app)
的函数,其值为host
,以便在容器内部的任何接口上进行侦听容器。
0.0.0.0
socketio.run(app, host='0.0.0.0')