简单的烧瓶服务不会在docker容器外响应

时间:2018-06-06 19:32:17

标签: docker flask

嗨,并且事先感谢,我是码头工的新手,我被困在一个简单的码头工具示例中,在容器外露出烧瓶服务。

我有一个名为rest_example的文件夹,位于dockerfile和.py文件中。 这是我的dockerfile:

FROM ubuntu:16.04
LABEL maintainer="Lorem Ipsum"
RUN apt-get update  &&  \
    apt-get install -y python  && \
    apt-get install -y python-pip  && \
    pip install Flask  && \
    apt-get install -y curl  && \
    mkdir files
COPY flask_example.py /files
ENV FLASK_APP /files/flask_example.py
EXPOSE 5000
CMD flask run

这是flask_example.py:

from flask import Flask

app = Flask(__name__)

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

我正在创建这样的图像: docker run rest_example -t -p 5000:5000 --name = rest_example --rm

当我在容器内点击curl localhost:5000/hello时,这是响应: Hello World!,表示烧瓶在容器内部,但在我的本地浏览器中没有对该URL的响应。

2 个答案:

答案 0 :(得分:2)

如果查看documentation,您会发现:

  

外部可见服务器

     

如果您运行服务器,您会注意到   服务器只能从您自己的计算机访问,而不能从任何计算机访问   其他在网络中。这是默认值,因为在调试模式下a   应用程序的用户可以在您的上执行任意Python代码   计算机。

     

如果禁用了调试器或信任网络上的用户,   只需添加即可使服务器公开   --host = 0.0.0.0到命令行:

     

烧瓶运行--host = 0.0.0.0

     

这告诉您的操作系统要监听   所有公共IP。

您在启动容器时确实发布了端口5000,但没有指示Flask实际听取外部'接口

您确实正确地启动了容器,以便连接“外部”'容器到本地机器,但没有任何东西存在。

尝试这样的dockerfile,添加上面显示的文档中提到的参数:

FROM ubuntu:16.04
LABEL maintainer="Lorem Ipsum"
RUN apt-get update  &&  \
    apt-get install -y python  && \
    apt-get install -y python-pip  && \
    pip install Flask  && \
    apt-get install -y curl  && \
    mkdir files
COPY flask_example.py /files
ENV FLASK_APP /files/flask_example.py
EXPOSE 5000
CMD flask run --host=0.0.0.0

答案 1 :(得分:1)

一个更好的选择是禁用调试器,并强制flask应用程序直接从您的代码监听所有接口,而无需修改Dockerfile。

这是一个不错的工作片段:

from flask import Flask

# init the app
app = Flask(__name__)

# sample route
@app.route('/hello')
def hello():
    return 'Hello World!'


if __name == '__main__':

    # running the server
    app.run(debug=False, host='0.0.0.0')