Docker部署Flask应用(flask+gunicorn+gevent)入门

Python Web框架

文章目录

  • Python Web框架
  • Flask应用
  • 使用Gunicorn+Gevent运行Flask应用
  • Dockerfile
  • Docker
    • Docker容器
    • 使用Docker镜像和仓库
      • 构建镜像(基于基础镜像)
  • GitLab CI
      • **.gitlab-ci.yml 参数详解**

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中用到的命令有:
Docker部署Flask应用(flask+gunicorn+gevent)入门_第1张图片

  • 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)。
Docker部署Flask应用(flask+gunicorn+gevent)入门_第2张图片
列出镜像 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账号,安装Apache apt-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配置任务-官方配置文件翻译

<新手入门,欢迎批评指正!>

你可能感兴趣的:(python)