手把手教你将Flask应用封装成Docker服务的实现
作者:似繁星跌入梦
项目背景
在之前的一个项目中用Python的Flask写了一个提供公共基础服务的Rest应用,上面大佬的意思是需要将这一部分封装成容器化服务,实现快速部署、管理以保证连续可用性。你知道如何将你的Flask项目部署到Docker中吗?
大佬安排嘉宾席!不会的那咱们就接着往下看~
看完请记得点赞哟!点赞的人最可爱。偷偷告诉你们这段时间出于文章题材跟挑战面试了一些公司,也收到了一些offer!Python领域岗(大部分爬虫)。点赞过一百的话我整理之后开篇专场如何?说不定里面就有你下一次要采得大坑!而且公司说不定就有你在的或你正准备面的哟
1. 部署准备
- Flask:Python Web开发中最火的玄冥二老之一,它最大的特点就是轻量级
- Gunicorn:熟悉JAVA 或者 PHP 做开发的可能对 Python的应用部署还是有些懵的,Flask应用是一个符合WSGI规范的Python应用,不能单独运行,需要依赖其他的组件提供服务器功能
- Gevent:Gunicorn 默认使用同步阻塞的网络模型(-k sync),对于高并发的访问并不太友好,所以我们需要使用gevent来提高并发量
- Dokcer:容器!你也可以把它理解为一个“盒子”。有时候我们会倦于管理项目的部署和维护。如果使用容器封装项目,那么只需要维护一个配置文件完成部署需求,包括后续将整个部署的过程完全自动化,部署就会变得更便捷
来!这里简单的画一个图来描述Flask应用被容器化服务的流程图
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环境对依赖包的安装
由于我的这台云服务器Python环境是2.7,所以在安装Gunicron的时候pip它默认会安装最新版本>=3.4,所以2.7环境使用指定版本18.0
既然是真正的部署,你是否知道Flask应用它是一个符合WSGI规范的Python应用?它不能独立运行(类似run的方式只适合开发模式),需要依赖其他组件提供服务器功能。所以上面依赖包选择了Gunicorn+Gevent的超级组合,开始构建Gunicorn配置文件(下面workers的功能可以实际根据你的项目需求来定制化,我这边内部使用的话完全是够用的)
好了以后你可以使用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下肚精神爽,下面看看理想状态下的效果它应该是以下这样的
看来套路还是熟悉的味道,没有带给我们其它的烦恼,也并没有出现其它异常的状况。你可以使用docker images这条命令获取本地镜像的列表,啰!就是它
$ 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这条命令获取当前容器列表,啰!就是下面这个图,可以看到你的Flask应用已经部署到了Dcoker服务中运行,开心吧!还不赶紧测试一下你的成果
好的,到这里你已经掌握了如何将你的Flask应用封装成一个Docker服务,所以在这个过程中我们不仅需要理解Flask应用的常规部署方法,更要掌握容器化部署应用的技巧。你看现在的容器技术多火爆,能不学习吗?怎么滴也得学它一招半式哟。如果我们需要规模化的管理大量Dokcer容器时,可以考虑用K8s来做它将会简化我们更多的工作
到此这篇关于手把手教你将Flask应用封装成Docker服务的实现的文章就介绍到这了,更多相关Flask封装成Docker服务内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!