我有两个运行flask的Docker容器,只是我正在运行的一个简单的后端/前端示例位,用于学习docker和flask。
我的前端是:
from flask import flask,jsonify
import requests
import simplejson
import json
app = flask(__name__)
@app.route('/')
def hello():
uri = "http://127.0.0.1:5000/tasks"
try:
uResponse = requests.get(uri)
except requests.ConnectionError:
return "Connection Error"
Jresponse = uResponse.text
data = json.loads(Jresponse)
fullString = ""
title = data['tasks'][0]['title']
description = data['tasks'][0]['description']
fullString += title
fullString += "<br/>"
fullString += description
return fullString
if __name__ == '__main__':
app.run(debug=True,host="0.0.0.0",port=2000)
当我在本地运行它时,它工作正常,当我在docker中运行它时,它也工作。我可以转到localhost:2000
的前端,并且看到有效的数据。
我的后端代码是:
from flask import flask,request,jsonify,make_response
from flask import abort
import csv
import json
import flask
app = flask(__name__)
tasks = [
{
'id': 1,'title': u'example title 1','description': u'example description 1','done': False
},{
'id': 2,'title': u'example title 2','description': u'example description 2','done': False
}
]
@app.route('/tasks',methods=['GET'])
def get_tasks():
return jsonify({'tasks': tasks})
if __name__ == '__main__':
app.run(debug=True,port=5000)
如果我都在没有docker的情况下运行这两个程序,而我去了localhost:2000
的前端,我得到了我所期望的任务描述和标题的第0个条目。
当我在docker中运行这些命令时,一切似乎正常,但是我从前端获得了Connection Error
。因此,requests.get(uri)
似乎在被docker化后无法正常工作。
这是我的docker文件
对于后端
FROM ubuntu:latest
MAINTAINER me
RUN apt-get update -y
RUN apt-get install -y python3-pip python3-dev build-essential
COPY . /app
WORKDIR /app
RUN pip3 install -r requirements.txt
ENTRYPOINT ["python3"]
CMD ["backend.py"]
对于前端
FROM ubuntu:latest
MAINTAINER me
RUN apt-get update -y
RUN apt-get install -y python3-pip python3-dev build-essential
COPY . /app
WORKDIR /app
ENV flaSK_APP=/app/frontend.py
ENV flaSK_ENV=development
RUN pip3 install -r requirements.txt
ENTRYPOINT ["python3"]
CMD ["frontend.py"]
因此,似乎它们都可以单独工作,但无法沟通。这是为什么?似乎并不明显,我是Docker的新手。
EDIT1
前端命令:
sudo docker run -d -p 2000:2000 frontend
后端命令:
sudo docker run -d -p 5000:5000 backend
EDIT2
我将其移至docker compose,并出现了相同的问题。
docker-compose.yml
version: '3'
services:
backend:
build:
context: backend/
dockerfile: compose/lib/backend/Dockerfile
ports:
- "5000:5000"
frontend:
build:
context: lib/frontend/
dockerfile: compose/lib/frontend/Dockerfile
ports:
- "2000:2000"
未更改Docker文件。根据文档here,我不需要特定的网络连接是正确的,并且创建了默认网络。但是,这在烧瓶下仍然可以正常工作,但是我无法使用docker或docker-compose来附加它们。