基于Docker的Flask项目部署

基于Docker的Flask项目部署

最近使用flask框架完成了一个项目,准备部署到服务器上边,捣鼓了几天,终于搞定了,回来写一下部署心得体会。

为什么选择docker

将软件打包成标准化单元,用于开发,装运和部署

容器是一个标准的软件单元,它将代码及其所有的依赖关系打包,以便应用程序从计算环境快速可靠地运行到另外一个计算环境。Docker容器映像是一个轻量级,独立地可执行软件包,包含运行应用程序所需地一切:代码,运行时,系统工具,系统库和设置。

容器映像在运行时成为容器,在Docker容器的情况下——映像在Docker Engine上运行时成为容器。适用于基于Linux和Windows的应用程序,无论基础架构如何,容器化软件都将始终运行相同。容器将软件与其环境隔离开来,并确保它可以统一运行,尽管开发和分段之间存在差异。

个人使用体验:自从接触了docker我就一直使用docker部署自己的项目以及一些其他东西(例如:Mysql、Redis等),在本地主机中配合wsl使用,体验简直完美。一般我都会在本地先将自己的项目打包成镜像,在本地测试,能正常工作后,就将它镜像上传到阿里云镜像站或者腾讯云镜像站,然后再在服务器使用docker拉取,然后运行,部署简单,一次打包,多处部署。

关于Flask部署的一些坑

因为是第一次接触这个框架,所以对部署有点陌生,以为它也可以跟golang的项目那样,编译成一个二进制可执行文件,然后再使用Alpine这类轻量级的Linux镜像进行部署。

但是flask开发文档说,在开发时,你可以使用内置的服务器,但是其自带服务器的处理能力比较有限。默认情况下一次只能处理一个请求,当然你也可以设置为多进程或者多线程的情况。但是在生产环境 下你就应当选择功能完整的服务器。Werkzeug的WSGI服务器不适合在生产环境中使用。在开发过程中作为便利提供。它没有考虑到安全性或性能(默认情况下一次只处理一个请求)。使用真正的WSGI应用程序服务器(如uWSGI或Gunicorn)来提高性能,并通过真正的Web服务器(如Nginx)进行代理,以提高性能和安全性。 Web服务器擅长于排队请求/响应,可以同时提供静态和其他内容,并被设计为处理SSL。 WSGI服务器能够有效协调整个应用程序的多个请求。 Werkzeug被设计成WSGI库,而不是Web服务器或WSGI服务器。

总而言之,Flask应用是一个符合WSGI规范的Python应用,不能独立运行(类似app.run的方式仅适合开发模式),需要依赖其他的组件提供服务器功能。

服务器的选择

  • Gunicorn

    Gunicorn 是一个给 UNIX 用的 WSGI HTTP 服务器。这是一个从 Ruby 的 Unicorn 项目移植的 pre-fork worker 模式。它既支持 eventlet ,也 支持 greenlet 。在这个服务器上运行 Flask 应用是相当简单的:

    gunicorn myproject:app
    

    Gunicorn 提供了许多命令行选项 —— 见 gunicorn -h 。 例如,用四个 worker 进程( gunicorn -h )来运行一个 Flask 应用,绑定 到 localhost 的4000 端口( -b 127.0.0.1:4000 ):

    gunicorn -w 4 -b 127.0.0.1:4000 myproject:app
    
  • Gevent

    Gevent 是一个基于协同程序的 Python 网络库,使用

你可能感兴趣的:(docker,docker,flask)