如何在Docker容器中运行Python Flask

19
我尝试在Docker容器中运行Python Flask web服务器,但我无法从外部连接到Flask服务器。 我做了什么: 我创建了/temp/HelloFlask.py文件。
from flask import Flask
app = Flask(__name__)

@app.route("/")
def hello():
    return "Hello World!"

if __name__ == "__main__":
    app.run()

我使用Docker容器,并将容器的端口5000映射到主机的5000端口,并将~/temp挂载到/temp。
docker run -it -p 5000:5000 -v ~/temp:/temp --name tf gcr.io/tensorflow/tensorflow:latest-devel

在运行的 Docker 容器中,我安装了 Flask 并运行了 HelloFlask.py

cd /temp
pip install Flask
python HelloFlask.py &

我验证了容器内的服务器可访问性

[root@de8b6996b540:/temp# curl localhost:5000
127.0.0.1 - - [22/Sep/2016 17:41:48] "GET / HTTP/1.1" 200 -
Hello World!

我正在使用版本为1.12.1(build:12133)的Docker,在本地主机上暴露容器端口,所以我应该能够在容器外部的Mac上访问localhost:5000,但我无法连接。
我测试了一下,确保Docker正确将容器端口绑定到localhost,方法是按照docker for mac快速入门中所述运行nginx容器,并且我可以通过localhost从容器中访问端口。
1个回答

48

尝试 app.run(host='0.0.0.0')

默认情况下,Flask服务器仅限于本地主机访问。在您的情况下,容器是本地主机,而您的请求来自容器外部。参数host='0.0.0.0'使得服务器可以从外部IP地址访问。 Flask文档中详细描述了它(参见Flask文档)


5
我有同样的问题,但是设置host='0.0.0.0'没有起作用。即使我执行app.run(host='0.0.0.0', port=1234)并且运行docker-compose up,它仍然显示:Running on http://127.0.0.1:5000/。为什么它没有在我指定的主机和端口上运行? - Arnold Parge
10
非常感谢,我花了两个晚上才弄清楚这个问题。似乎对于较新的Flask版本,您需要将其添加到Python命令中:CMD ["python3", "-m", "flask", "run", "--host=0.0.0.0"]。 - xeonman9000

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接