手把手教你将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 相关文章推荐
分享15个最受欢迎的Python开源框架
Jul 13 Python
浅谈Python程序与C++程序的联合使用
Apr 07 Python
完美解决python遍历删除字典里值为空的元素报错问题
Sep 11 Python
Python元组操作实例分析【创建、赋值、更新、删除等】
Jul 24 Python
python使用matplotlib模块绘制多条折线图、散点图
Apr 26 Python
Python flask框架post接口调用示例
Jul 03 Python
Django中使用CORS实现跨域请求过程解析
Aug 05 Python
FFrpc python客户端lib使用解析
Aug 24 Python
python3-flask-3将信息写入日志的实操方法
Nov 12 Python
Python 实现一个计时器
Jul 28 Python
Python 如何实现数据库表结构同步
Sep 29 Python
Python接口自动化之文件上传/下载接口详解
Apr 05 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
?生?D片??C字串
2006/12/06 PHP
PHP 5.0对象模型深度探索之类的静态成员
2008/03/27 PHP
smarty半小时快速上手入门教程
2014/10/27 PHP
php简单获取目录列表的方法
2015/03/24 PHP
php基于session实现数据库交互的类实例
2015/08/03 PHP
PHP list() 将数组中的值赋给变量的简单实例
2016/06/13 PHP
PHP实现的简单在线计算器功能示例
2017/08/02 PHP
Laravel开启跨域请求的方法
2019/10/13 PHP
写的htc的数据表格
2007/01/20 Javascript
浅谈关于JavaScript的语言特性分析
2013/04/11 Javascript
JS运动相关知识点小结(附弹性运动示例)
2016/01/08 Javascript
返回函数的JavaScript函数
2016/06/14 Javascript
AngularJS使用指令增强标准表单元素功能
2016/07/01 Javascript
JS日程管理插件FullCalendar简单实例
2017/02/07 Javascript
Vue 自定义动态组件实例详解
2018/03/28 Javascript
JavaScript设计模式之建造者模式实例教程
2018/07/02 Javascript
layui结合form,table的全选、反选v1.0示例讲解
2018/08/15 Javascript
H5+C3+JS实现双人对战五子棋游戏(UI篇)
2020/05/28 Javascript
vue-router实现编程式导航的代码实例
2019/01/19 Javascript
jQuery实现消息弹出框效果
2019/12/10 jQuery
JavaScript数组排序小程序实现解析
2020/01/13 Javascript
举例讲解Python的Tornado框架实现数据可视化的教程
2015/05/02 Python
详解Python中的from..import绝对导入语句
2016/06/21 Python
Python实现获取本地及远程图片大小的方法示例
2018/07/21 Python
Python字典创建 遍历 添加等实用基础操作技巧
2018/09/13 Python
python 输出所有大小写字母的方法
2019/01/02 Python
Pytorch 保存模型生成图片方式
2020/01/10 Python
Python 内存管理机制全面分析
2021/01/16 Python
英国著名音像制品和图书游戏购物网站:Zavvi
2016/08/04 全球购物
Raffaello Network德国:意大利拉斐尔时尚购物网
2019/05/01 全球购物
编程实现去掉XML的重复结点
2014/05/28 面试题
日语专业毕业生求职信
2013/12/04 职场文书
中学实习教师自我鉴定
2013/12/12 职场文书
2014年迎新年活动方案
2014/02/19 职场文书
保密工作目标责任书
2014/07/28 职场文书
详解thinkphp的Auth类认证
2021/05/28 PHP