文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

Flask+python3+super

2023-01-31 08:21

关注

背景

手里有一个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,但是相信对一些人还是有用的。

阅读原文内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯