Dockerize Flask Application

2018-02-10

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

1
2
3
4
5
6
7
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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
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