Docker部署Flask

最近闲得想把flask项目部署到服务器上,参考了官方文档后,最初选择的是Apache的httpd+mod_wsgi。但apache的配置实在是过于繁琐,各种错误频频发生。尽管通过参考一些网上的资料排除了许多故障,但最后的404问题实在不知道怎么解决。之后转战uWSGI+nginx,但最后的nginx error实在是让我束手无策…… httpd和nginx的错误日志里也没有显示什么,项目在开发环境中也没有问题……所以干脆放弃了,改用了Docker。

安装Docker

这点就不用详细说明什么了,正常安装就可以了。

1
$ yum install docker

Gunicorn + Gevent

由于flask是一个基于wsgi标准的python应用,app.run()这类方法只可以在开发环境下使用,也就是说,flask项目不可以独立运行,需要其他中间件来提供web服务器功能。此处使用的是Gunicorn。为了弥补并发量,采用Gevent。Gevent能够提供对于协程的支持。

Gunicorn和Gevent需要使用pip进行安装

1
$ pip install gunicorn gevent

可见,两者是python的第三方库,所以此处安装只是为了后面测试用。Docker build镜像的时候还需要另作安装。

相关配置

在项目文件夹下新建gunicorn.conf.py配置文件

1
2
3
workers = 5   #定义处理的进程数量,可根据需求自行定义
worker_class = "gevent"
bind = "0.0.0.0:5000" #端口号可自行定义

通过下面的命令来进行测试

1
gunicorn your_startup_file:app -c gunicorn.conf.py

其中your_startup_file为flask项目的运行文件,例如,项目中的python启动文件为app.py,此处就改为app。

在项目文件夹下创建一个文本文档,用来存储项目需要的依赖包,以便Docker在build的时候知道需要安装哪些库。此处我命名为packages.txt。

1
$ vi packages.txt

打开后,根据个人需求写下项目需要的依赖包。

1
2
3
4
5
6
gunicorn
gevent
flask
flask_cors
tensorflow
...

之后,创建一个Dockerfile文件,指导Docker进行镜像的构建。

1
$ vi Dockerfile

以下是Dockerfile的内容:

1
2
3
4
5
6
7
8
9
FROM python:3.6
WORKDIR the/path/to/your/application

COPY requirements.txt ./
RUN pip install -r packages.txt

COPY . .

CMD ["gunicorn", "your_startup_file:app", "-c", "./gunicorn.conf.py"]

其中第二行为访问项目文件夹的绝对路径。最后一行的your_startup_file为flask项目的运行文件。第四行是告诉docker执行pip install -r packages.txt来进行依赖包的安装,根据需求可在后面添加安装源。例如添加清华源:pip install -r packages.txt -i https://pypi.tuna.tsinghua.edu.cn/simple

创建镜像

上述步骤完成后,即可开始构建镜像

1
$ docker build '/the/path/to/your/application'

build需要一定的时间,完成后,可通过以下命令来查看镜像ID:

1
$ docker images

部署

最后一步就很简单了,直接全部扔给docker就可以了。
使用Docker以daemon方式在生产环境中运行:

1
$ docker run -d -p 5000:5000 --name any_name your_image_ID

其中5000:5000为运行的端口号,可自行定义。

一切完成后,flask项目就可正常访问了。



Docker真是个好用的东西
写都写了,顺便不要脸地宣传一下我的大作业NLP(逃
Author

s.x.

Posted on

2020-01-18

Updated on

2021-11-19

Licensed under

Comments