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

背景

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

技術架構

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

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

整改方案

首先咱們須要將DB和Flask App拆分開,使用supervisor將包括DB在哪的全部進程,都控制在一塊兒,因此咱們須要經他們分開:nginx

  • 直接使用docker pull 下載指定版本的redis和mongo就能夠
  • 構建flask app的dockerfileweb

    • 在dockerfile中,咱們決定不實用supervisor,具體緣由下面說;
    • 因爲以前的supervisor是安裝在centos中的,咱們代碼使用python3,因此在centos上裝了一個虛擬環境,用於跑flask代碼,因此咱們使用python:3.6-slim爲基礎鏡像;在使用apline鏡像的時候,不能安裝一些依賴,包括supervisor,因此我選擇了slim,後面拆分的時候由於supervisor在slim中,每次啓動都有問題,因此我放棄了supervisor,這樣你也可使用apline,可是我仍是保持了slim;redis

      FROM python:3.6-slim
      
      COPY . /app
      
      WORKDIR /app
      
      RUN pip install -i https://pypi.douban.com/simple -r requirements.txt
      
      
      EXPOSE 5000
      
      ENV FLASK_APP=manage.py
    • 上面構建的是整個flask項目的鏡像,包括寫數據庫的進程(可獨立運行),還有一個廣播的進程,最後就是flask自己的進程;咱們已經將數據庫獨立出來,因此在原來的代碼中須要將訪問數據庫的URL host修改對應的IP,也可使用--link,直接指定contianer的名字代替host,具體原理沒有詳細研究。(後來發現,在平滑升級的時候仍是須要將DB對應的端口暴露給宿主機,原本使用--link是不須要的);
    • flask鏡像包含了寫數據庫,flask自己(能夠理解爲讀數據庫)和廣播功能,咱們在啓動鏡像的時候,須要啓動這三個進程,分別是: flask run --host 0.0.0.0; flask wdb; flask broadcast;
    • 爲了保持代碼的完整,咱們不使用flask run命令,而使用原來的gunicorn+gevent的方式執行代碼;
相關文章
相關標籤/搜索