手把手教你将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中for循环控制语句用法实例
Jun 02 Python
Python文件操作之合并文本文件内容示例代码
Sep 19 Python
Python 判断 有向图 是否有环的实例讲解
Feb 01 Python
Python爬虫实战:分析《战狼2》豆瓣影评
Mar 26 Python
python实现在pandas.DataFrame添加一行
Apr 04 Python
完美解决Python 2.7不能正常使用pip install的问题
Jun 12 Python
python xpath获取页面注释的方法
Jan 14 Python
python机器学习库scikit-learn:SVR的基本应用
Jun 26 Python
python数据预处理方式 :数据降维
Feb 24 Python
详解python 支持向量机(SVM)算法
Sep 18 Python
使用tkinter实现三子棋游戏
Feb 25 Python
python编程学习使用管道Pipe编写优化代码
Nov 20 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
DIY实用性框形天线
2021/03/02 无线电
PHP中去除换行解决办法小结(PHP_EOL)
2011/11/27 PHP
apache php mysql开发环境安装教程
2016/07/28 PHP
Yii实现复选框批量操作实例代码
2017/03/15 PHP
js 绑定带参数的事件以及手动触发事件
2010/04/27 Javascript
仅Firefox中链接A无法实现模拟点击以触发其默认行为
2011/07/31 Javascript
通过jQuery源码学习javascript(一)
2012/12/27 Javascript
如何使用Jquery获取Form表单中被选中的radio值
2013/08/09 Javascript
jquery.Ajax()方法调用Asp.Net后台的方法解析
2014/02/13 Javascript
jquery validate 自定义验证方法介绍 日期验证
2014/02/27 Javascript
Js实现滚动变色的文字效果
2014/06/16 Javascript
jQuery对val和atrr("value")赋值的区别介绍
2014/09/26 Javascript
JS实现黑色风格的网页TAB选项卡效果代码
2015/10/09 Javascript
Js 获取当前函数参数对象的实现代码
2016/06/20 Javascript
angularjs实现猜大小功能
2017/10/23 Javascript
Node.Js中实现端口重用原理详解
2018/05/03 Javascript
Vue项目使用localStorage+Vuex保存用户登录信息
2019/05/27 Javascript
Electron + vue 打包桌面操作流程详解
2019/06/24 Javascript
微信小程序利用for循环解决内容变更问题
2020/03/05 Javascript
[06:24]DOTA2 2015国际邀请赛中国区预选赛第二日TOP10
2015/05/27 DOTA
在Linux下调试Python代码的各种方法
2015/04/17 Python
python实现八大排序算法(1)
2017/09/14 Python
python之matplotlib学习绘制动态更新图实例代码
2018/01/23 Python
python pandas修改列属性的方法详解
2018/06/09 Python
用Python实现职工信息管理系统
2020/12/30 Python
门卫人员岗位职责
2013/12/24 职场文书
新学期班主任寄语
2014/01/18 职场文书
后备干部培训方案
2014/05/22 职场文书
火灾现场处置方案
2014/05/28 职场文书
学风建设演讲稿
2014/09/12 职场文书
2014公安机关纪律作风整顿思想汇报
2014/09/13 职场文书
学校党风廉政建设调研报告
2015/01/01 职场文书
2015年社区民政工作总结
2015/04/21 职场文书
女性健康知识讲座主持词
2015/07/04 职场文书
化工生产实习心得体会
2016/01/22 职场文书
导游词之烟台威海蓬莱
2019/11/14 职场文书