ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

Flask 项目打包 线上部署

2021-11-26 10:03:00  阅读:333  来源: 互联网

标签:gunicorn Flask app flask gevent 线上 镜像 docker 打包


文章目录

本文涉及的相关技术:flask + gunicorn + gevent+ docker


图床简介

前端时间小牛不是写了个自用的图床,最近有闲暇的时候,迭代了一下,准备打包到服务器上

迭代内容是:之前只能从固定的文件夹中去读取图片,感觉太麻烦了,小牛在公司还用不了;目前还支持了 点击、拖拽、复制粘贴上传图片,并将本地的服务打包到服务器中,随时随地使用网页版图床

Flask代码

前期准备:flask+gevent+gunicorn 相关依赖都已安装好

#app.py

from flask import Flask

app = Flask(__name__)

@app.route('/')
def hello():
    return 'hello docker&flask'

if __name__ == '__main__':
    app.run(host='0.0.0.0')

因为举例子,所以项目没有采用blueprint 的方式去构建

python start.py 即可运行项目

host='0.0.0.0' 是因为笔者想在公网环境中访问,这样项目的路径ip就是当前服务主机的ip,不写的话只能通过127.0.0.1调用。

一般还有其他2种启动方式:

python -m flask run -p 8088 -h 127.0.0.2,这种可以指定项目启动时的ip和端口

flask run -p 8088 -h 127.0.0.2 纯flask启动,但作用和上面一种一样

上述启动方式,平时我们测试开发使用足以,但我们的程序一般得部署到服务器上,这样可就不够看了,我们要寻求更长久的真正的部署。这时 gevent+gunicorn的作用就来了

Gunicorn || gevent

Gunicorn: 是一个 UNIX 下的 WSGI HTTP 服务器 ,Flask应用是一个符合WSGI规范的Python应用,不能独立运行(类似app.run的方式仅适合开发模式), 处理高并发有所欠缺,需要依赖其他的组件提供服务器功能。通过优化 Gunicorn 配置提高性能

gevent:gevent一般搭配gunicorn来部署。gunicorn 默认使用同步阻塞的网络模型(-k sync),对于大并发的访问可能表现不够好,需要套一个gevent来增加并发量

docker: 近几年非常火的开源项目,核心功能容器,能够让开发者打包我们的应用以及依赖包到一个轻量级、可移植的容器中,然后发布到任何流行的 Linux 机器上,也可以实现虚拟化。

容器是完全使用沙箱机制,相互之间不会有任何接口(类似 iPhone 的 app),更重要的是容器性能开销极低。将项目与环境进行隔离

Flask部署关系图如下:

编写gunicorn配置文件

gunicorn.conf.py文件

sudo vim gunicorn.conf.py

添加代码:

workers = 5
worker_class = "gevent"
bind = "0.0.0.0:8080"

导出依赖

在app.py同级目录执行即可,将当前python环境的依赖全部写入requirements.txt 文件中,我们构建容器时,会去读取依赖配置

pip freeze > requirements.txt

编写dockerfile文件

这是最核心,也最容易出错的地方,笔者这边用的是最简单的写法,作为例子引入。详情可取查看官方文档

sudo vim Dockerfile  #创建文件

FROM python:3
MAINTAINER xiaoniuhululu
COPY requirements.txt ./
EXPOSE 5000
RUN pip install --no-cache-dir -r requirements.txt
COPY . .
CMD ["gunicorn", "app:app", "-c", "./gunicorn.conf.py"]

简单解释一下参数:
FROM # 指明我们创建的镜像,所依赖的基础镜像,我们这边是python3

MAINTAINER # 维护者信息

COPY # 将宿主机的文件cp到创建的镜像当前路径下

EXPOSE ## 仅仅只是声明端口。
帮助镜像使用者理解这个镜像服务的守护端口,以方便配置映射。
在运行时使用随机端口映射时,也就是 docker run -P 时,会自动随机映射 EXPOSE 的端口

RUN # 你需要在创建镜像之前,需要执行的命令

CMD # 创建容器后执行的第一个命令,一般是启动命令

定制镜像

上述的步骤 无论你是在windows环境 还是linux都可以,但接下来我们后续步骤在服务器环境(linux,不太建议用windows服务器 太浪费资源了)中操作

在当前目录下 有dockerfile执行命令
docker build -t upload-picture-flask . //-t 镜像的名字及标签, . 表示 在当前目录下寻找dockerfile

然后倒杯咖啡,慢慢的等待,因为制作镜像的过程需要联网下载大量的包,非常耗时,说个小技巧如果你的项目所需的依赖非常大,很看网速,容易失败,这个时候你可以去下一个对应的docker镜像到本地,然后在dockerfile添加from docker-你需要的镜像,就是将这个依赖作为多个基础镜像 定制你的项目镜像

查看生成的镜像

docker images 

以守护程序创建并启动容器

docker run -d -p 5000:5000 --name flaskUploadPicture upload-picture-flask:latest

-p容器内外端口映射

--name flaskUploadPicture 指定别名

upload-picture-flask:latest 所依赖的镜像,即我们刚刚生成的

(复制命令容易出错,请手打命令)

查看所有容器运行状态:

docker ps -a

效果

如果不行的话,检查外部映射的端口服务器防火墙 是否放开

如果还是不行的话,我们以下操作来核实原因

docker logs 容器id 查看docker日志

docker exec -it 容器id /bin/bash 进入镜像内部

图床最终效果图:

目前由于服务器压力大,准备放开10个人名额,大家要是想体验一下该图床的,关注公众号小牛呼噜噜找到微信联系小牛即可


本篇文章到这里就结束啦,如果喜欢的话,多多支持,欢迎关注!

标签:gunicorn,Flask,app,flask,gevent,线上,镜像,docker,打包
来源: https://blog.csdn.net/qq_41603102/article/details/121553093

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有