前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Flask项目Docker容器化部署原理与实现

Flask项目Docker容器化部署原理与实现

作者头像
oYabea
发布2020-09-07 11:47:41
1.5K0
发布2020-09-07 11:47:41
举报
文章被收录于专栏:夏天爱西瓜夏天爱西瓜

本文将介绍Flask的部署方案:Flask + Nginx + uWSGI,并使用docker进行容器化部署,部署的实例来源 Flask开发初探,操作系统为ubuntu。

Flask系列文章

  1. Flask开发初探
  2. WSGI到底是什么
  3. Flask源码分析一:服务启动
  4. Flask路由内部实现原理

部署方案

在开发时,我们使用flask run命令启动的开发服务器是werkzeug提供的,但是这种方式目的是为了开发,不能很好的扩展,不适合生产部署。生产部署,我们需要一个更强健,性能更高的WSGI服务器(关于WSGI,可参考WSGI到底是什么 ,常用的服务器有:uWSGI、Gunicorn等,本文以uWSGI举例。

像uWSGI这类WSGI服务器内置了Web服务器,所以我们不需要web服务器也可以与客户端交换数据,处理请求和响应,但是内置的web服务器不够强健,一般情况下都会使用一个常规的web服务器运行在前端,为WSGI服务器提供反向代理,web服务器选择Nginx,Nginx会把外部的请求转发给uWSGI处理,接收到响应后再返回给客户端,这样做的好处有:

  1. 提高静态文件的效率,因为Nginx处理静态文件的速度非常快
  2. 提升系统安全性,避免直接暴露WSGI服务器
  3. 提升程序处理能力,通过设置反向代理,配置负载均衡可以实现。

uWSGI配置

在使用uwsgi部署flask应用时,一定要记得将app.run()方法放在if __name__ == '__main__': 内部或者单独文件内,这样就可以保证其不会被调用,从而不会启动本地服务器。

uwsgi是一个服务器,使用前一定要安装:

代码语言:javascript
复制
pip install uwsgi

配置文件:

代码语言:javascript
复制
socket=/tmp/app.sock
chmod-socket=666
pidfile=/etc/nginx/uwsgi.pid
chdir=/home/**/mygithub/learn_flask/app
master=true
wsgi-file=serve.py
http=127.0.0.1:8005
callable=app
processes=8
threads=4
lazy-apps=true

对所配置的参数进行说明:

  • callable:Flask项目的实例名称
  • module:可调用对象的名称
  • processes:开启多少个子进程处理请求。
  • threads:每个进程的线程数

更多参数详情可见:uwsgi中文文档

在命令行中启动uwsgi服务器:

代码语言:javascript
复制
uwsgi --ini uwsgi.ini

在浏览器中输入 http://127.0.0.1:8005,可以验证服务启动。

nginx配置

安装nginx:

代码语言:javascript
复制
apt-get install nginx

启动nginx:

代码语言:javascript
复制
service nginx start

重启

代码语言:javascript
复制
service nginx restart

nginx配置:

代码语言:javascript
复制
server{
    listen  8080;
    server_name localhost;
    
    access_log /var/log/nginx/app_access.log;
    error_log /var/log/nginx/app_error.log;
    
    location / {
    	include uwsgi_params;
    	uwsgi_pass unix:/tmp/app.sock
	}
}

nginx配置文件nginx.conf通过include引用了conf.d和site_enabled这两个文件夹中的配置文件,所以我们可将配置文件放在这两个路径任意一处。

重启nginx和uwsgi,在浏览器中输入 http://127.0.0.1:8088 ,可以验证服务启动。

这样,就完成基础的nginx+uwsgi完成了Flask的部署。

容器化部署

接下来,介绍使用docker进行容器化部署。

docker配置

建议了解docker基本操作,首先,创建Dockerfile:

代码语言:javascript
复制
FROM ubuntu:16.04

RUN ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime && echo "Asia/Shanghai" > /etc/timezone
RUN apt update && apt install -y iputils-ping python3 python3-pip python3-tk libffi-dev libssl-dev
RUN apt install -y nginx && pip3 install uwsgi

ADD ['./', "/app"]
ADD ['./build', "/app"]
WORKDIR /app

RUN pip3 install -r requirements.txt

RUN chmod + x start_script.sh
CMD ['/start_script.sh']

注意:

  1. 该镜像的基础镜像为ubuntu:16.04,可自行docker pull
  2. 编写服务启动脚本start_script.sh
代码语言:javascript
复制
ln -s /app/nginx.conf /etc/nginx/conf.d/
nginx && uwsgi --ini uwsgi.ini

python3 serve.py

使用命令:

代码语言:javascript
复制
docker build -t image .

以上,就打包完成了镜像 (imagename),接下来执行docker run -d --name test imagename启动容器,执行docker ps -a 可以看到刚才启动的容器,执行docker logs -f 可查看日志。

另外,推荐使用k8s对docker容器进行编排管理,具体使用后续博客介绍。

代码可参照:my github

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2019-12-09 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 部署方案
    • uWSGI配置
      • nginx配置
      • 容器化部署
        • docker配置
        相关产品与服务
        容器镜像服务
        容器镜像服务(Tencent Container Registry,TCR)为您提供安全独享、高性能的容器镜像托管分发服务。您可同时在全球多个地域创建独享实例,以实现容器镜像的就近拉取,降低拉取时间,节约带宽成本。TCR 提供细颗粒度的权限管理及访问控制,保障您的数据安全。
        领券
        问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档