Flask+python3+supervisor+redis+docker+nginx技術架構web項目docker化(二)

背景

手裏有一個web項目,代碼按照前端代碼庫、後端代碼庫分別在GitHub上,分散帶來的結果是,不容易持續集成,好比你可能須要不少的job去保證一個項目的正常運做,可是這個項目也不是特別大,因此嘗試將代碼融合,於此同時將代碼docker化,用於持續部署。html

技術架構

原來的代碼使用gunicorn+gevent+supervisor+flask+DB的架構;具體的細節以下:前端

本地服務器搭建了一個nginx域名服務器,裏面區分PC端仍是手機端;
訪問域名經過nginx,訪問前端靜態頁面的內容
靜態頁面中加載指定地址的數據,提供數據的服務由flask後端提供接口;
後端提供的接口,經過訪問redis緩存和mongodb數據庫,返回相應的數據;nginx

docker-compose

上篇文章說了flask項目是怎麼拆分和組合的,可是上次僅僅是使用docker,多個容器之間使用的--link鏈接起來的,本篇文章將介紹如何使用docker-compose代替原來的多個docker命令;web

  • docker compose是什麼能夠自行搜索,我直接上個人docker-compose.ymlredis

    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;mongodb

  • dockerfile:docker

    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,可是相信對一些人仍是有用的。npm

相關文章
相關標籤/搜索