【发布时间】:2019-11-10 22:45:08
【问题描述】:
我有两个运行 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,host="0.0.0.0", port=5000)
如果我在没有 docker 的情况下运行这两个,然后我转到 localhost:2000 的前端,我会得到我所期望的,任务描述和标题的第 0 个条目。
当我在 docker 中运行这些时,一切似乎都正常,但我从前端获得了 Connection Error。因此,requests.get(uri) 似乎在 dockerized 后无法正常工作。
这是我的 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 将它们附加。
【问题讨论】:
标签: python python-3.x api docker flask