Docker部署Flask应用(flask+gunicorn+gevent)入门
Python Web框架python常用Web框架有Flask,Django等多种框架。Flask:一个用Python编写的轻量级Web应用框架Flask是一个使用Python编写的轻量级Web应用框架。基于Werkzeug WSGI工具箱和Jinja2 模板引擎。Flask也被称为“microframework”,因为它使用简单的核心,用extension增加其他功能。Flask没有默认使...
Python Web框架
文章目录
python常用Web框架有Flask,Django等多种框架。
Flask:一个用Python编写的轻量级Web应用框架
Flask是一个使用Python编写的轻量级Web应用框架。基于Werkzeug WSGI工具箱和Jinja2 模板引擎。Flask也被称为“microframework”,因为它使用简单的核心,用extension增加其他功能。Flask没有默认使用的数据库、窗体验证工具。
Django: Python Web应用开发框架
Django 应该是最出名的Python框架,GAE甚至Erlang都有框架受它影响。Django是走大而全的方向,它最出名的是其全自动化的管理后台:只需要使用起ORM,做简单的对象定义,它就能自动生成数据库结构、以及全功能的管理后台。
Flask应用
flask官网文档
创建一个最简单的Flask应用:
from flask import Flask
app = Flask(__name__)
@app.route('/')
def hello_world():
return 'Hello World!'
if __name__ == '__main__':
app.run()
运行这个应用,打开浏览器,输入网址127.0.0.1:5000并回车,将会返回Hello World字符。
使用Gunicorn+Gevent运行Flask应用
Flask应用是一个符合WSGI规范的Python应用,不能独立运行(类似app.run的方式仅适合开发模式),需要依赖其他的组件提供服务器功能。在这里,我们选择Gunicorn+Gevent的组合。
Gunicorn是一个unix上被广泛使用的高性能的Python WSGI UNIX HTTP Server。和大多数的web框架兼容,并具有实现简单,轻量级,高性能等特点。
书写Gunicorn的配置文件如下,命名为gunicorn.conf.py:
workers = 5 # 定义同时开启的处理请求的进程数量,根据网站流量适当调整
worker_class = "gevent" # 采用gevent库,支持异步处理请求,提高吞吐量
bind = "0.0.0.0:8888" # 监听IP放宽,以便于Docker之间、Docker和宿主机之间的通信
可以使用gunicorn命令来测试是否可以正确运行,命令:gunicorn app:app -c gunicorn.conf.py
Dockerfile
将应用部署到Docker中,可以监控和修复应用的运行状态。
需要为该应用创建一个requirements.txt文件,以便Docker环境的安装。
flask
gunicorn
gevent
有了这个文件,在安装Flask应用依赖的三方包时,可以直接用如下命令执行:pip install -r requirements.txt
然后我们还要创建一个Dockerfile文件,以便Docker镜像的构建:
在Dockerfile中用到的命令有:
FROM
FROM指定一个基础镜像, 一般情况下一个可用的 Dockerfile一定是 FROM 为第一个指令。至于image则可以是任何合理存在的image镜像。RUN
RUN命令将在当前image中执行任意合法命令并提交执行结果。命令执行提交后,就会自动执行Dockerfile中的下一个指令。ENV
ENV指令可以用于为docker容器设置环境变量。USER
USER 用来切换运行属主身份的。WORKDIR
WORKDIR 用来切换工作目录的。Docker 默认的工作目录是/,只有 RUN 能执行 cd 命令切换目录,而且还只作用在当下下的 RUN,也就是说每一个 RUN 都是独立进行的。如果想让其他指令在指定的目录下执行,就得靠 WORKDIR。WORKDIR 动作的目录改变是持久的,不用每个指令前都使用一次 WORKDIR。COPY
COPY 将文件从路径 src复制添加到容器内部路径 dest。src>必须是相对于源文件夹的一个文件或目录,也可以是一个远程的url,dest 是目标容器中的绝对路径。ADD
ADD 将文件从路径 src 复制添加到容器内部路径 dest。CMD
Dockerfile中只能有一个CMD指令。 如果你指定了多个,那么最后个CMD指令是生效的。CMD指令的主要作用是提供默认的执行容器。这些默认值可以包括可执行文件,也可以省略可执行文件。当你使用shell或exec格式时, CMD 会自动执行这个命令。ENTRYPOINT
是指定 Docker image 运行成 instance (也就是 Docker container) 时,要执行的命令或者文件。
ENTRYPOINT 的格式和 RUN 指令格式一样,分为 exec 格式和 shell 格式。ENTRYPOINT 的目的和 CMD 一样,都是在指定容器启动程序及参数。
FROM python:3
COPY requirements.txt ./
RUN pip install --no-cache-dir -r requirements.txt&&makdir /app
COPY . /app
WORKDIR /app
CMD ["gunicorn", "simple_flask:app", "-c", "gunicorn.conf.py"]
上述命令中,simple_flask 是 flask 的主文件,app 是 主文件中的 app flask 对象。
Docker
Docker是一个能够把开发的应用程序自动部署到容器的开源引擎。Docker在虚拟化的容器执行环境中增加了一个应用程序部署引擎。该引擎的目标就是提供一个轻量、快速的环境,能够运行开发者的程序,并方便高效地将程序从开发者的笔记本部署到测试环境,然后再部署到生产环境。
Docker推荐单个容器只运行一个应用程序或进程。
Docker的核心组件:
- Docker客户端和服务器;
- Docker镜像;
- Registry;
- Docker容器。
镜像是构建Docker世界的基石,用户基于镜像来运行自己的容器。镜像是Docker生命周期中的构建或打包阶段,而容器则是启动或执行阶段。
Docker容器就是:
- 一个镜像格式;
- 一系列标准的操作;
- 一个执行环境。
比喻来说集装箱运输货物,而Docker运输软件(镜像)。
Docker容器
创建容器 sudo docker run -i -t ubuntu /bin/bash
示例中使用的是ubuntu镜像。
此时,Docker在文件系统内部用这个镜像创建了一个新容器。该容器拥有自己的网络、IP地址,以及一个用来和宿主机进行通信的桥接网络接口。随后,我们告诉Docker在新容器中要运行什么命令,在本例中我们在容器中运行/bin/bash 命令启动了一个Bash shell。
容器命名 sudo docker run --name container_001 -i -t ubuntu /bin/bash
该命令创建一个名为container_001的容器。
重启容器 sudo docker start container_001
shell会话 sudo docker attach container_001
守护式容器没有交互式会话,非常适合运行应用程序和服务。
启动守护式容器 sudo docker run --name daemon_dave -d ubuntu /bin/sh -c "while tru; do echo hell world; sleep 1; done"
参数-d表示容器放到后台运行
停止守护式容器 sudo docker stop daemon_dave
获取容器日志 sudo docker logs tail 0 -ft daemon_dave
Ctrl+C退出日志跟踪。
查看容器 sudo docker ps -n x
显示最后x个容器。
使用Docker镜像和仓库
一个镜像可以放到另一个镜像的顶部,最底部的镜像称为基础镜像(base image)。
列出镜像 sudo docker images
拉取镜像 sudo docker pull jamtur01/puppetmaster
构建容器 sudo docker run -i -t jamtur01/pappetmaster /bin/bash
构建镜像(基于基础镜像)
构建Docker镜像的两种方法:
dorker commit
命令docker build
命令和Dockerfile文件(建议使用)
先创建Docker Hub账号,安装Apacheapt-get -yqq update
;apt-get -y install apache2
将这个容器作为一个Web服务器来运行,保存当前状态,先退出容器exit
然后再sudo docker commit 4aabcb75 jamtur01/apache2
指定容器ID 4aabcb75 和目标镜像仓库和镜像名 jamtur01/apache2。
用Dockerfile构建一个能作为Web服务器的Docker镜像,然后执行docker build 命令 sudo docker build -t="jamtur01/static_web:v1" .
此处jamtur01/static_web 是创建Dockerfile所在的文件夹目录。 -t选项为新镜像设置了仓库和名称,v1是标签,“镜像名:标签”。
上述命令最后的 .
告诉Docker到本地目录中去找Dockerfile文件。
GitLab CI
GitLab CI使用YAML文件(.gitlab-ci.yml)进行项目配置,该文件位于代码仓库的根目录中,包含有关如何构建项目的pipeline,以及pipeline需要完成哪些工作。
pipeline 一次 Pipeline 其实相当于一次构建任务,里面可以包含多个流程,如build、test、deploy测试服务器、部署生产服务器等流程,任何成员的commit push到GitLab上时都可以触发 Pipeline。
.gitlab-ci.yml 参数详解
stages 定义pipeline的全部阶段(stage),阶段内所有任务并行执行,全部执行成功开始下一阶段任务,任何阶段内任意job执行失败都会导致pipeline失败,所有stage,job执行成功后pipeline会显示pass。如果未定义stages,则默认有build、test、deploy三个阶段,如果未定义stage,则默认test阶段。
Jobs YAML文件定义了一组具有约束的作业,说明应该何时运行它们。可以指定无限数量的作业,这些作业被定义为任意名称的抬头,但是始终必须至少应包含script子句。
stage
定义job属于哪个阶段,默认test阶段。script
定义在runner中执行的命令。job内唯一一项必须的关键字设置,配置runner执行的shell命令。tags
定义哪个标签的runner来执行,该标签指runner配置时的名称,不是Git的tag分支。only
定义哪些分支或tag的修改触发该流程。variables
定义job层次的变量。用于定义全局或私有变量,同时内置了一些内置变量。
参考文章:
完整Python使用docker打包部署flask项目(flask+gunicorn+gevent)
使用Dockerfile创建docker镜像
gunicorn 介绍与性能分析
gunicorn 详解
Docker 创建镜像、修改、上传镜像
通过 .gitlab-ci.yml配置任务-官方配置文件翻译
<新手入门,欢迎批评指正!>
更多推荐
所有评论(0)