Dockerize Flask Application

Posted by JC on 2018-02-10 12:46:17 Updated on 2018-02-10 12:46:17

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

tags: docker, flask, python


BMC logoBuy me a coffee via Alipay or Wechat Pay