手把手教你将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格式化css文件的方法
Mar 10 Python
Python简单实现安全开关文件的两种方式
Sep 19 Python
Python基于win32ui模块创建弹出式菜单示例
May 09 Python
pygame游戏之旅 按钮上添加文字的方法
Nov 21 Python
实例详解Python模块decimal
Jun 26 Python
PyTorch: 梯度下降及反向传播的实例详解
Aug 20 Python
Python基于WordCloud制作词云图
Nov 29 Python
使用python写一个自动浏览文章的脚本实例
Dec 05 Python
pytorch实现Tensor变量之间的转换
Feb 17 Python
python3使用Pillow、tesseract-ocr与pytesseract模块的图片识别的方法
Feb 26 Python
关于python中remove的一些坑小结
Jan 04 Python
matplotlib更改窗口图标的方法示例
Feb 03 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
Terran兵种介绍
2020/03/14 星际争霸
php 获取可变函数参数的函数
2009/08/26 PHP
C#静态方法与非静态方法实例分析
2014/09/22 PHP
PHP中使用BigMap实例
2015/03/30 PHP
php上传功能集后缀名判断和随机命名(强力推荐)
2015/09/10 PHP
yii添删改查实例
2015/11/16 PHP
php实现水印文字和缩略图的方法示例
2016/12/29 PHP
关于Yii中模型场景的一些简单介绍
2019/09/22 PHP
javascript基础的动画教程,直观易懂
2007/01/10 Javascript
jQuery 加上最后自己的验证
2009/11/04 Javascript
javascript面向对象包装类Class封装类库剖析
2013/01/24 Javascript
使用jQuery实现鼠标点击左右按钮滑动切换
2017/08/04 jQuery
vue.js组件vue-waterfall-easy实现瀑布流效果
2017/08/22 Javascript
原生JS实现移动端web轮播图详解(结合Tween算法造轮子)
2017/09/10 Javascript
jQuery结合jQuery.cookie.js插件实现换肤功能示例
2017/10/14 jQuery
vue做网页开场视频的实例代码
2017/10/20 Javascript
浅谈Koa2框架利用CORS完成跨域ajax请求
2018/03/06 Javascript
微信小程序入门之广告条实现方法示例
2018/12/05 Javascript
vue下的@change事件的实现
2019/10/25 Javascript
JavaScript实现滑动门效果
2020/01/18 Javascript
Python实现截屏的函数
2015/07/26 Python
Python求算数平方根和约数的方法汇总
2016/03/09 Python
浅谈Python的文件类型
2016/05/30 Python
Python的scikit-image模块实例讲解
2020/12/30 Python
CSS3 透明色 RGBA使用介绍
2013/08/06 HTML / CSS
css3 中translate和transition的使用方法
2020/03/26 HTML / CSS
使用Canvas操作像素的方法
2018/06/14 HTML / CSS
Paradox London官方网站:英国新娘鞋婚礼鞋品牌
2019/08/29 全球购物
在Java开发中如何选择使用哪种集合类
2016/08/09 面试题
下面这个程序执行后会有什么错误或者效果
2014/11/03 面试题
文秘人员工作职责
2014/01/31 职场文书
企业务虚会发言材料
2014/10/20 职场文书
2014年学校党建工作汇报材料
2014/11/02 职场文书
国家助学金受助感言
2015/08/01 职场文书
酒店厨房管理制度
2015/08/06 职场文书
高一军训感想
2015/08/07 职场文书