我有两个运行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)
似乎在被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来附加它们。
答案 0 :(得分:2)
您可以共享您正在使用的docker run
命令吗?
您是否使用-p
标志公开端口?
docker run -p 5000:5000 ...
[更新] :根据您的docker安装和配置,您可能无法使用该IP。 Docker认为127.0.0.1
IP的意思是“这个容器”,而不是“这台机器”。
一个bridged network可能解决了这个问题,但是我建议改用docker-compose
(以下详细信息)。
如果出于本实验的目的,您打算始终在同一台计算机上同时运行这两个容器,请始终使用docker-compose
,允许您从同一master命令运行多个容器,并为您提供了不错的附加功能,例如创建一个虚拟网络以使两者相互连接,而无需外部网络访问它们。例如您的数据服务器只能对另一个烧瓶容器可见,但可以在主机的网络接口上公开。
对于docker-compose,您可以使用以下(未经测试的)docker-compose.yml作为开始:
version: 3
services:
backend:
build: path/to/dockerfile
ports:
- 5000:5000
frontend:
build: path/to/dockerfile
ports:
- 2000:2000