在 Docker 中部署 Flask 应用程序时,尽管容器看起来正在运行,但可能会遇到服务器连接问题。本文将调查一个常见问题并提供一个解决方案,以确保可以从容器外部访问该应用程序。
考虑一个在 Flask 上运行的名为“perfektimprezy”的应用程序,其以下来源:
from flask import Flask app = Flask(__name__) app.debug = True @app.route('/') def main(): return 'hi' if __name__ == '__main__': app.run()
当部署在 Docker 容器中时,服务器似乎正在运行,但应用程序仍然无法从外部访问
用于部署的 Dockerfile 为:
# Dockerfile FROM dreen/flask MAINTAINER dreen WORKDIR /srv # Get source RUN mkdir -p /srv COPY perfektimprezy.tar.gz /srv/perfektimprezy.tar.gz RUN tar x -f perfektimprezy.tar.gz RUN rm perfektimprezy.tar.gz # Run server EXPOSE 5000 CMD ["python", "index.py"]
部署步骤包括构建映像并运行暴露端口 5000 的容器:
>$ sudo docker build -t perfektimprezy . >$ sudo docker run -i -p 5000:5000 -d perfektimprezy
容器似乎正在按预期运行,并且Flask 服务器在容器内侦听端口 5000:
>$ sudo docker logs 1c50b67d45b1 * Running on http://127.0.0.1:5000/ (Press CTRL+C to quit) * Restarting with stat
但是,从容器外部向应用程序发出的请求会导致空回复:
>$ curl 127.0.0.1:5000 -v * Empty reply from server
问题在于 Flask 应用程序与本地主机接口的绑定。要使应用程序可以从容器外部访问,它应该绑定到 0.0.0.0 地址。
在 Flask 应用程序初始化中,将:
if __name__ == '__main__': app.run()
更改为:
if __name__ == '__main__': app.run(host='0.0.0.0')
此修改会将应用程序绑定到主机上的所有接口,使其可以从容器外部访问。
以上是为什么我的 Flask 应用部署到 Docker 后无法访问?的详细内容。更多信息请关注PHP中文网其他相关文章!