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 | workers = 5 #定义处理的进程数量,可根据需求自行定义 |
通过下面的命令来进行测试
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 | gunicorn |
之后,创建一个Dockerfile文件,指导Docker进行镜像的构建。
1 | vi Dockerfile |
以下是Dockerfile的内容:
1 | FROM python:3.6 |
其中第二行为访问项目文件夹的绝对路径。最后一行的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项目就可正常访问了。