Flask 应用程序未在 docker 中暴露于外部世界

Posted

技术标签:

【中文标题】Flask 应用程序未在 docker 中暴露于外部世界【英文标题】:Flask application is not exposing to external world in docker 【发布时间】:2022-01-23 23:46:28 【问题描述】:

我通过 AWS EC2 在 docker 容器中托管一个烧瓶应用程序,它将显示上传到它的文件的内容。

我面临一个奇怪的问题是我的应用程序没有暴露给外部世界,但它可以在 localhost 上运行。当我尝试点击我的机器的公共 ip 时,它显示“拒绝连接”(注意:安全组很好)

docker ps 命令显示我的容器在预期的端口号上运行良好。您能告诉我如何解决它以使其正常工作吗?提前致谢

Docker 版本 20.10.7,构建 f0df350

这是我的 Dockerfile,

  FROM ubuntu:latest
  RUN mkdir /testing
  WORKDIR /testing
  ADD . /testing
  RUN apt-get update&&apt-get install -y pip
  RUN pip install -r requirements.txt
  CMD flask run

在我的 requirements.txt 文件中,我将烧瓶安装在 docker 中。

这是我的烧瓶代码和 html 文件,

    from flask import Flask,render_template,request
    app = Flask(__name__)
    @app.route("/")
    def file():
        return render_template("index.html")
    @app.route("/upload", methods= ['POST','GET'])
    def test():
             print("test")
             if request.method == 'POST':
                   print("test3")
                   file = request.files['File'].read()
                   return file

   if __name__ == "__main__":
             app.run(debug=True,host='0.0.0.0')

index.html:

    <html>
       <body>
         <form action = "http://<publiciIPofmachine>:5000/upload" method = "POST" enctype = 
        "multipart/form-data">
        <input type = "file" name = "File" />
        <input type = "submit" value = "Submit" />
    </form>
  </body>
</html>

码头日志:

服务 Flask 应用程序“应用程序”(延迟加载)

环境:生产 警告:这是一个开发服务器。不要在生产部署中使用它。 请改用生产 WSGI 服务器。 调试模式:开启 在所有地址上运行。 警告:这是一个开发服务器。不要在生产部署中使用它。 在http://172.17.0.2:5000/ 上运行(按 CTRL+C 退出)

这是我使用的 docker 命令,

    docker build -t <name> .
    docker run -d -t -p 5000:80 <imagename>

【问题讨论】:

【参考方案1】:

您在 docker run 命令中有错字:

背景

这就是docs say:

-p=[]      : Publish a container's port or a range of ports to the host
               format: ip:hostPort:containerPort | ip::containerPort | hostPort:containerPort | containerPort
               Both hostPort and containerPort can be specified as a
               range of ports. When specifying ranges for both, the
               number of container ports in the range must match the
               number of host ports in the range, for example:
                   -p 1234-1236:1234-1236/tcp

所以你以以下格式发布端口:hostPort:containerPort

解决方案

代替你的代码:

    docker run -d -t -p 5000:80 <imagename>

你应该这样做

     docker run -d -t -p 80:5000 <imagename>

但最好在容器中定义 EXPOSE 层 :)

EXPOSE 有两个作用:

这种文档,无论谁在阅读您的 Dockerfile,他们都知道应该公开哪个端口。 您可以使用--publish-all | -P 标志发布所有公开的端口。

【讨论】:

您好丹尼尔,感谢您的回复。它确实奏效了。我的前端工作正常。但现在我的后端没有收到请求。即使在 docker 中没有为 POST 方法捕获日志。但是我的烧瓶应用程序在没有 docker 的情况下运行良好。你能在这里点灯吗? 能否请我们展示一下,您是如何启动前端和后端的?如果两者都在 docker 中,您应该使用 --link 选项,或者将它们放在同一个网络中,这是首选。

以上是关于Flask 应用程序未在 docker 中暴露于外部世界的主要内容,如果未能解决你的问题,请参考以下文章

Flask 应用程序未在 AWS 弹性 beantalk 上部署

如何使用Python和Flask创建自签名证书

使用 Flask-Session 扩展,未在烧瓶会话中设置密钥

Docker撰写:允许服务之间的网络交互

反射未在 docker 容器/jar 上找到类

Mac 上带有 Node 和 Express 的 Docker 容器,未在浏览器中显示?