Flask+python3+super

发布时间:2019-10-15 09:03:58编辑:auto阅读(2242)

    背景

    手里有一个web项目,代码按照前端代码库、后端代码库分别在GitHub上,分散带来的结果是,不容易持续集成,比如你可能需要很多的job去保证一个项目的正常运作,但是这个项目也不是特别大,所以尝试将代码融合,于此同时将代码docker化,用于持续部署。

    技术架构

    原来的代码使用gunicorn+gevent+supervisor+flask+DB的架构;具体的细节如下:

    本地服务器搭建了一个nginx域名服务器,里面区分PC端还是手机端;
    访问域名通过nginx,访问前端静态页面的内容
    静态页面中加载指定地址的数据,提供数据的服务由flask后端提供接口;
    后端提供的接口,通过访问redis缓存和mongodb数据库,返回相应的数据;

    docker-compose

    上篇文章说了flask项目是怎么拆分和组合的,但是上次仅仅是使用docker,多个容器之间使用的--link连接起来的,本篇文章将介绍如何使用docker-compose代替原来的多个docker命令;

    • docker compose是什么可以自行搜索,我直接上我的docker-compose.yml

          version: '3'
          
          services:
               flask:
                  image: "flask:latest"
                  restart: always
                  depends_on:
                    - mongoDB 
                 - redisDB
                  tty: true
                  stdin_open: false
                  environment:
                    SLEEP_SECOND: 10
                  container_name: flask
                  logging:
                    driver: "json-file"
                    options:
                      max-size: "200M"
                      max-file: "10"
                  command: "gunicorn manage:app -k gevent -w 4 -b 0.0.0.0"
                  volumes:
                    - $HOME/logs:/app/logs
                networks:
                  - inline-network
                ports:
                  - "8000:8000"
        
              matrix:
                image: "flask:latest"
                restart: always
                depends_on:
                  - mongoDB
                  - redisDB
                tty: true
                stdin_open: false
                environment:
                  SLEEP_SECOND: 10
                container_name: matrix
                command: "flask matrix"
                volumes:
                  - $HOME/logs:/app/logs
                  - /etc/localtime:/etc/localtime
                networks:
                 - inline-network
        
              broadcast:
                image: "flask:latest"
                restart: always
                depends_on:
                  - mongoDB
                  - redisDB
                tty: true
                stdin_open: false
                environment:
                  SLEEP_SECOND: 10
                container_name: broadcast
                command: "flask broadcast"
                volumes:
                  - $HOME/logs:/app/logs
                  - /etc/localtime:/etc/localtime
                networks:
                  - inline-network
        
            redisDB:
              image: "redis:latest"
              container_name: redis
              restart: always
              networks:
                inline-network:
                  aliases:
                    - redis
              ports:
                - "6379:6379"
        
            mongoDB:
              image: "mongo:latest"
              restart: always
              container_name: mongo
              ports:
                - "27017:27017"
              volumes:
                - /var/lib/mongo:/data/db
              networks:
                inline-network:
                  aliases:
                    - mongo
        
        networks:
          inline-network:
            driver: "bridge"
        
    ```
    • 解释:所有的启动的dontainer都在inline-network网络环境中,所以可以直接使用aliases指定的名字作为数据库连接时候的host,本来是不打算将数据库的端口的,只给flask用,但是后面由于切换的时候是现切换数据库,在切换后段flask的镜像,所以就将数据库端口和宿主机绑定了。
    • 其中flask、matrix、broadcast,都是之前代码中的功能,使用supervisor启动的,现在单独启动三个docker进程去完成。

    前端docker

    前端的PC端和移动端,都使用npm构建成dist文件,然后通过nginx定向到指定的dist文件内容就可以,所以我们对前端的代码也进行了docker化,使用的是nginx;

    • dockerfile:

      FROM nginx:1.15-alpine
      
      COPY dist/ /usr/share/nginx/html
      
      COPY default.conf /etc/nginx/conf.d/default.conf
      
      ENTRYPOINT nginx -g "daemon off;"
    • default.conf

       server {
           listen       80;
           server_name  localhost;
       
           #charset koi8-r;
           #access_log  /var/log/nginx/host.access.log  main;
       
           location / {
               root   /usr/share/nginx/html;
               index  index.html index.htm;
               try_files $uri $uri/ /index.html;
           }
       
       
           #error_page  404              /404.html;
       
           # redirect server error pages to the static page /50x.html
           #
           error_page   500 502 503 504  /50x.html;
           location = /50x.html {
               root   /usr/share/nginx/html;
           }
       }
    • PC端和移动端使用的dockerfile和default.conf都是上面的;
    • 在服务其部署的时候,只需要部署域名服务,将PC端和移动端的docker镜像映射到宿主机的8088和8087端口,服务器nginx配置中根据PC请求和移动端的请求,定位到指定的PC/移动端nginx镜像即可。

    总结

    本次镜像化大概花了一周的时间,包括测试和解决一些坑,很多知识点包括原来的项目都不是太熟悉,所以记录一下,可能回头会发现这些很LOW,但是相信对一些人还是有用的。

关键字