手把手教你将Flask应用封装成Docker服务的实现


Posted in Python onAugust 19, 2020

项目背景

  在之前的一个项目中用Python的Flask写了一个提供公共基础服务的Rest应用,上面大佬的意思是需要将这一部分封装成容器化服务,实现快速部署、管理以保证连续可用性。你知道如何将你的Flask项目部署到Docker中吗?

大佬安排嘉宾席!不会的那咱们就接着往下看~

看完请记得点赞哟!点赞的人最可爱。偷偷告诉你们这段时间出于文章题材跟挑战面试了一些公司,也收到了一些offer!Python领域岗(大部分爬虫)。点赞过一百的话我整理之后开篇专场如何?说不定里面就有你下一次要采得大坑!而且公司说不定就有你在的或你正准备面的哟

手把手教你将Flask应用封装成Docker服务的实现

1. 部署准备

  • Flask:Python Web开发中最火的玄冥二老之一,它最大的特点就是轻量级
  • Gunicorn:熟悉JAVA 或者 PHP 做开发的可能对 Python的应用部署还是有些懵的,Flask应用是一个符合WSGI规范的Python应用,不能单独运行,需要依赖其他的组件提供服务器功能
  • Gevent:Gunicorn 默认使用同步阻塞的网络模型(-k sync),对于高并发的访问并不太友好,所以我们需要使用gevent来提高并发量
  • Dokcer:容器!你也可以把它理解为一个“盒子”。有时候我们会倦于管理项目的部署和维护。如果使用容器封装项目,那么只需要维护一个配置文件完成部署需求,包括后续将整个部署的过程完全自动化,部署就会变得更便捷

来!这里简单的画一个图来描述Flask应用被容器化服务的流程图

手把手教你将Flask应用封装成Docker服务的实现

2. 构建配置文件

假设我们有一个Flask应用,它的启动文件里面内容是下面这样的

如果你使用python命令运行去运行下面这个应用,打开你的浏览器输入网址127.0.0.1:5000将会返回下面那句话

from flask import Flask

app = Flask(__name__)

@app.route('/')
def Project():
  return '来了?老哥儿!给个关注&点赞不迷路哟'

if __name__ == '__main__':
  app.run(debug=True)

但是这样简单的操作,只要你的小指头摁一下 ctrl + c ,或者关掉你的终端,本次启动的服务应用也就走到了尽头,所以我们需要寻求更长久、稳定的真正部署

  首先在部署工作开展前请确保你的环境已经安装Docker,然后在Flask项目下创建一个requirements.txt文件,为什么要创建它呢?因为它作为python项目常用到的一个文件,可以让我们的项目中Python环境对依赖包的安装

手把手教你将Flask应用封装成Docker服务的实现

由于我的这台云服务器Python环境是2.7,所以在安装Gunicron的时候pip它默认会安装最新版本>=3.4,所以2.7环境使用指定版本18.0

  既然是真正的部署,你是否知道Flask应用它是一个符合WSGI规范的Python应用?它不能独立运行(类似run的方式只适合开发模式),需要依赖其他组件提供服务器功能。所以上面依赖包选择了Gunicorn+Gevent的超级组合,开始构建Gunicorn配置文件(下面workers的功能可以实际根据你的项目需求来定制化,我这边内部使用的话完全是够用的)

手把手教你将Flask应用封装成Docker服务的实现

好了以后你可以使用Gunicorn提供的命令测试一下服务是否可以正确的运行,来人!搬命令

$ gunicorn app:app -c gunicorn.conf.py

如果你发现出现了错误,首先你可以根据它的异常信息提示进行修复(一般无非就是依赖包、环境、版本相关的一些问题)当然!你也可以来骚扰我

  看到这我相信以上的基本操作对于你来讲问题不是很大!那么我们现在需要做的就是需要创建一个Dokcerfile文件,以便构建你的Docker镜像

FROM python:2.7
WORKDIR /usr/src/Project
COPY requirements.txt ./
RUN pip install -r requirements.txt -i https://pypi.tuna.tsinghua.edu.cn/simple
COPY . .
CMD ["gunicorn", "demo:app", "-c", "./gunicorn.conf.py"]

Dockerfile中的每一行都是一条命令

  • FORM指定将在其中构建新镜像的基础容器镜像。 这样一来,你从一个现有的镜像开始,添加或改变一些东西,并最终得到一个派生的镜像【这里选择的是python2.7)】
  • WORKDIR设置将要安装应用程序的默认目录【当我在上面创建Project用户时,会自动创建了一个主目录,所以现在我将该目录设置为默认目录。 最后在Dockerfile中的任何剩余命令执行以及运行容器时,其当前目录都会为这个默认目录】
  • COPY将文件从你的机器复制到容器文件系统【它需要两个或更多参数,源文件/目录和目标文件/目录。 源文件必须与Dockerfile所在的目录相关, 目的地可以是绝对路径】
  • RUN执行任意命令, 跟我们在shell下输入命令相似【创建一个虚拟环境,然后在其中安装requirements.txt文件中的所有Python依赖】
  • CMD当然就是启动Falsk服务,demo是我们项目启动文件:启动应用名变量app

3. 构建镜像

完成以上基本操作后,就可以开始构建你的Docker镜像了,以下使用docker build命令的-t参数设置了新容器镜像的名称和标签。 那个点表示容器构建的基础目录,这就是Dockerfile所在的目录。 构建过程将执行Dockerfile中的所有命令并创建镜像,该镜像将存储在你自己的机器上

docker build -t project:latest .

这个过程需要消耗一点时间,python:2的基础镜像它怎么说也有几百个M,请给予它应有的尊重。这个时候你可以为即将到来的胜利泡上一杯苦口的coffee庆祝这美好的时刻。OK!coffee下肚精神爽,下面看看理想状态下的效果它应该是以下这样的

手把手教你将Flask应用封装成Docker服务的实现

看来套路还是熟悉的味道,没有带给我们其它的烦恼,也并没有出现其它异常的状况。你可以使用docker images这条命令获取本地镜像的列表,??【褪撬?/p>

$ docker images
REPOSITORY TAG   IMAGE ID   CREATED    SIZE
project  latest 54a47d0c27cf 12 seconds ago 941MB

4. 构建Docker服务

最后你只差一步就能完成本次的部署工作,我相信这是个令你激动的时刻,请整理好你的思绪来使用Daemon的方式将你的Docker服务发布到生产环境中,来!上命令

$ docker run -d -p 5901:5901 --name FalskServer FlaskProject

你可以使用docker ps这条命令获取当前容器列表,??【褪窍旅嬲飧鐾迹?梢钥吹侥愕?lask应用已经部署到了Dcoker服务中运行,开心吧!还不赶紧测试一下你的成果

手把手教你将Flask应用封装成Docker服务的实现

好的,到这里你已经掌握了如何将你的Flask应用封装成一个Docker服务,所以在这个过程中我们不仅需要理解Flask应用的常规部署方法,更要掌握容器化部署应用的技巧。你看现在的容器技术多火爆,能不学习吗?怎么滴也得学它一招半式哟。如果我们需要规模化的管理大量Dokcer容器时,可以考虑用K8s来做它将会简化我们更多的工作

到此这篇关于手把手教你将Flask应用封装成Docker服务的实现的文章就介绍到这了,更多相关Flask封装成Docker服务内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

Python 相关文章推荐
python利用sklearn包编写决策树源代码
Dec 21 Python
利用Python2下载单张图片与爬取网页图片实例代码
Dec 25 Python
微信跳一跳自动运行python脚本
Jan 08 Python
Python中的heapq模块源码详析
Jan 08 Python
python 实现读取一个excel多个sheet表并合并的方法
Feb 12 Python
django的ORM模型的实现原理
Mar 04 Python
python学习--使用QQ邮箱发送邮件代码实例
Apr 16 Python
Django中Middleware中的函数详解
Jul 18 Python
wxPython修改文本框颜色过程解析
Feb 14 Python
python3.9之你应该知道的新特性详解
Apr 29 Python
Pyhton模块和包相关知识总结
May 12 Python
python数字转对应中文的方法总结
Aug 02 Python
python实现每天自动签到领积分的示例代码
Aug 18 #Python
numpy中生成随机数的几种常用函数(小结)
Aug 18 #Python
在 Python 中使用 MQTT的方法
Aug 18 #Python
安装pyecharts1.8.0版本后导入pyecharts模块绘图时报错: “所有图表类型将在 v1.9.0 版本开始强制使用 ChartItem 进行数据项配置 ”的解决方法
Aug 18 #Python
Python 处理日期时间的Arrow库使用
Aug 18 #Python
python七种方法判断字符串是否包含子串
Aug 18 #Python
Python使用socket模块实现简单tcp通信
Aug 18 #Python
You might like
提升PHP执行速度全攻略(下)
2006/10/09 PHP
PHP 数组排序方法总结 推荐收藏
2010/06/30 PHP
如何使用php判断服务器是否是HTTPS连接
2013/07/05 PHP
Yii中render和renderPartial的区别
2014/09/03 PHP
php中实现xml与mysql数据相互转换的方法
2014/12/25 PHP
php版微信返回用户text输入的方法
2016/11/14 PHP
javascript globalStorage类代码
2009/06/04 Javascript
javaScript checkbox 全选/反选及批量删除
2010/04/28 Javascript
NodeJS 模块开发及发布详解分享
2012/03/07 NodeJs
如何在JavaScript中实现私有属性的写类方式(一)
2013/12/04 Javascript
js实现可键盘控制的简单抽奖程序
2016/07/13 Javascript
浅谈Node.js:理解stream
2016/12/08 Javascript
js cookie实现记住密码功能
2017/01/17 Javascript
thinkphp标签实现bootsrtap轮播carousel实例代码
2017/02/19 Javascript
微信小程序之获取当前位置经纬度以及地图显示详解
2017/05/09 Javascript
vue弹窗组件使用方法
2018/04/28 Javascript
解决vuejs项目里css引用背景图片不能显示的问题
2018/09/13 Javascript
jQuery pjax 应用简单示例
2018/09/20 jQuery
jquery实现Ajax请求的几种常见方式总结
2019/05/28 jQuery
了解JavaScript中let语句
2019/05/30 Javascript
js实现无限瀑布流实例方法
2019/09/16 Javascript
three.js如何实现3D动态文字效果
2021/03/03 Javascript
在Windows8上的搭建Python和Django环境
2014/07/03 Python
Python简明入门教程
2015/08/04 Python
Pytorch提取模型特征向量保存至csv的例子
2020/01/03 Python
使用Python实现牛顿法求极值
2020/02/10 Python
波兰最大的宠物用品网上商店:FERA.PL
2019/08/11 全球购物
入职担保书怎么写
2014/05/12 职场文书
竞聘上岗演讲
2014/05/19 职场文书
大学生创业计划书
2014/08/14 职场文书
孩子教育的心得体会
2014/09/01 职场文书
新郎婚礼答谢词
2015/01/04 职场文书
GitHub上77.9K的Axios项目有哪些值得借鉴的地方详析
2021/06/15 Javascript
python3实现常见的排序算法(示例代码)
2021/07/04 Python
SpringBoot实现quartz定时任务可视化管理功能
2021/08/30 Java/Android
alibaba seata服务端具体实现
2022/02/24 Java/Android