Flask 应用的部署还是非常简单的,无论是用 gunicorn 还是 uwsgi,如果要用 nginx 做代理,HTTPS 加密也只需要就需要用 ubuntu 系统来做 base image 了,其实都一样,但是现在我发现了一个问题,我还没搞明白 nginx 和 gunicorn 都设置了 worker 数之后这个整个服务会是怎么启动着的,到底有几个 worker,是什么层级的,这个还需要研究一下。
Docker 化 Flask 应用,我只用了 gunicorn,因为还用了 Celery 任务队列,Celery 还要依赖 Redis,还有个问题就是在 Docker 里面 Redis 的数据持久化我还没搞明白怎么弄,挂载了目录但是没有生成 dump.rdb 文件。还要个需要注意的点就是因为 redis 也在 Docker 里面,app.py
里面的 app.config.update()
Redis 作为 Celery 的 Broker,
redis host 用 docker-compose.yml 的 container_name avatar-gen-redis
。
其实我只是把这个应用跑起来了而已,Docker 很多概念都没搞明白,比如 Dockerfile 和 docker-compose 里面都有 CMD 或者是 command,docker-compose.yml flask 配置中的 build: .
是会用到 Dockerfile,那我用 docker-compose up 启动的时候到底是哪条命令启动的 Flask 应用和 Celery 呢,这个我也不知道,还要就是Docker 化了之后怎么看日志呢,Docker 一旦用上手了是挺好,尤其是对于本地开发,但是如果上线的化就又有很多问题了,复杂度上升,原来原生的部署方式各个组件都能控制,Docker 化就进入黑盒里面了,又需要新的解决方案,所以现在各种容器云,容器编排管理,k8s 各种玩意。
Dockerfile
FROM python:3.6.3
MAINTAINER lsdvincent lsdvincent@gmail.com
COPY . /avatar-gen
WORKDIR /avatar-gen
RUN pip install -r requirements.txt
CMD ["gunicorn", "app:app", "-c", "gunicorn.conf"]
CMD ["celery", "-A", "app.celery", "worker", "--loglevel=info", "--autoscale=4,2"]
docker-compose.yml
version: "3"
services:
flask:
container_name: avatar-gen-flask
build: .
command: gunicorn app:app -c gunicorn.conf
restart: always
ports:
- '5000:5000'
volumes:
- .:/avatar-gen
networks:
- flask-redis-celery
redis:
container_name: avatar-gen-redis
image: 'redis'
command: redis-server
restart: always
ports:
- '6379:6379'
volumes:
- ./avatar_gen:/data
networks:
- flask-redis-celery
celery:
container_name: avatar-gen-celery
build: .
command: celery -A app.celery worker --loglevel=info --autoscale=4,2
restart: always
volumes:
- .:/avatar-gen
networks:
- flask-redis-celery
networks:
flask-redis-celery:
参考链接
http://containertutorials.com/docker-compose/flask-simple-app.html https://github.com/danriti/nginx-gunicorn-flask https://github.com/xuqinghan/nginx-gunicorn-flask