Sorry, your browser cannot access this site
This page requires browser support (enable) JavaScript
Learn more >

通过gunicorn+docker部署flask项目

由于学习上的原因,有幸接触到了 Python 项目部署到服务器的知识点,经过查找资料了解到,通过 flask 框架编写 Python 项目,并通过 gunicorn 运行项目以及 docker容器化服务,即可实现将其部署到服务器。

1、准备

首先我们需要准备一个完整的能在运行的 flask 项目,并且需要在服务器上安装好 docker 容器。
以下我使用一个基础的 flask Hello World 项目进行配置,项目的基本结构如下:
This is a picture without description
其中app.py是程序的启动类文件,Dockerfile是docker的配置文件,可以用来创建docker的镜像文件,requirements.txt是所有依赖的名称,docker 会根据这些名称来下载你所需要的依赖,gunicorn.conf.py是 gunicorn 服务器的配置文件,其中有线程以及端口等内容。

2、配置文件编辑

  1. 首先是启动类的内容

启动类是 flask 框架的必备内容,其内容如下:

1
2
3
4
5
6
7
8
9
10
from flask import Flask

app = Flask(__name__)

@app.route('/')
def hello_world(): # put application's code here
return 'Hello World!'

if __name__ == '__main__':
app.run()
  1. requirements.txt文件内容

里头写上所有我们所需要的依赖,如下:

1
2
3
flask
gunicorn
gevent
  1. gunicorn.conf.py

里头写上 gunicorn 启动的时候的配置文件,如下:

1
2
3
workers = 4        # 定义同时开启的处理请求的进程数量,根据网站流量适当调整
worker_class = "gevent" # 采用gevent库,支持异步处理请求,提高吞吐量
bind = "0.0.0.0:8080" # 这里8080可以随便调整
  1. Dockerfile

该文件是 docker 创建镜像的时候比较重要的文件,通过读取其中的内容创建一个镜像,内容如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
# FROM:所构建镜像基于什么镜像
FROM python:3.7
# WORKDIR:之后的shell语句是运行在哪个目录下
# 写到你运行的文件的位置
# 写的是要部署到服务器上的路径,如果这个镜像没有这个文件就会自动创建这个文件
WORKDIR /home/chen/ff
# COPY:将当前宿主机的文件拷贝到镜像里面去
# 这里我们是把python安装的依赖requirements.txt拷贝到镜像里面去
# requirements.txt是依赖包的名字,里面写上要下载的依赖
COPY requirements.txt ./
# RUN 执行shell命令,在构建的时候就会运行
# 这里是安装python依赖 配置镜像源
RUN pip install -r requirements.txt -i https://pypi.tuna.tsinghua.edu.cn/simple/
# 复制当前目录到项目中的WorkDir中
COPY . .
# 第一个app是我们的flask的python文件名 第二个app为flask的应用名
CMD ["gunicorn", "app:app", "-c", "./gunicorn.conf.py"]

3、构建docker镜像并运行

将以上文件打包上传到服务器上,然后在该目录下即可创建 docker 的镜像文件。
通过以下的命令即可创建:

1
docker build -t 'myflask_app2' .

This is a picture without description
注意:此处由于我之前已经创建过一次了,所以直接成功,首次创建回=会遍历你的配置文件然后下载。

完成之后就会显示出已经创建的镜像文件
This is a picture without description

随后运行该镜像文件,通过以下的命令:

1
docker run -p 8087:8086 --name myflask2 myflask_app2

This is a picture without description

运行成功之后通过访问服务器的8087端口,即可访问我们的内容
This is a picture without description

随后通过docker ps可以查看现在正在运行的镜像
This is a picture without description

至此就算是部署成功了。