手把手教你將Flask應用封裝成Docker服務

項目背景

  在之前的一個項目中用Python的Flask寫了一個提供公共基礎服務的Rest應用,上面大佬的意思是需要將這一部分封裝成容器化服務,實現快速部署、管理以保證連續可用性。你知道如何將你的Flask項目部署到Docker中嗎?

大佬安排嘉賓席!不會的那咱們就接着往下看~

看完請記得點贊喲!點讚的人最可愛。偷偷告訴你們這段時間出於文章題材跟寂寞的心面試了很多公司,小-中-大都有,也收到了一部分offer!Python領域崗(大部分爬蟲)。點贊過一百的話我整理之後開篇專場如何?說不定裏面就有你下一次要採得大坑!而且公司說不定就有你在的或你嚮往的喲

在這裏插入圖片描述

1. 部署準備

  • Flask:Python Web開發中最火的玄冥二老之一,它最大的特點就是輕量級
  • Gunicorn:熟悉JAVA 或者 PHP 做開發的可能對 Python的應用部署還是有些懵的,Flask應用是一個符合WSGI規範的Python應用,不能單獨運行,需要依賴其他的組件提供服務器功能
  • Gevent:Gunicorn 默認使用同步阻塞的網絡模型(-k sync),對於高併發的訪問並不太友好,所以我們需要使用gevent來提高併發量
  • Dokcer:容器!你也可以把它理解爲一個“盒子”。有時候我們會倦於管理項目的部署和維護。如果使用容器封裝項目,那麼只需要維護一個配置文件完成部署需求,包括後續將整個部署的過程完全自動化,部署就會變得更便捷

來!這裏簡單的畫一個圖來描述Flask應用被容器化服務的流程圖

在這裏插入圖片描述

2. 構建配置文件

假設我們有一個Flask應用,它的啓動文件裏面內容是下面這樣的

如果你使用python命令運行去運行下面這個應用,打開你的瀏覽器輸入網址127.0.0.1:5000將會返回下面那句話

from flask import Flask

app = Flask(__name__)

@app.route('/')
def Project():
    return '來了?老哥兒!給個關注&點贊不迷路喲'

if __name__ == '__main__':
    app.run(debug=True)

但是這樣簡單的操作,只要你的小指頭摁一下 ctrl + c ,或者關掉你的終端,本次啓動的服務應用也就走到了盡頭,所以我們需要尋求更長久、穩定的真正部署

  首先在部署工作開展前請確保你的環境已經安裝Docker,然後在Flask項目下創建一個requirements.txt文件,爲什麼要創建它呢?因爲它作爲python項目常用到的一個文件,可以讓我們的項目中Python環境對依賴包的安裝

由於我的這臺雲服務器Python環境是2.7,所以在安裝Gunicron的時候pip它默認會安裝最新版本>=3.4,所以2.7環境使用指定版本18.0

  既然是真正的部署,你是否知道Flask應用它是一個符合WSGI規範的Python應用?它不能獨立運行(類似run的方式只適合開發模式),需要依賴其他組件提供服務器功能。所以上面依賴包選擇了Gunicorn+Gevent的超級組合,開始構建Gunicorn配置文件(下面workers的功能可以實際根據你的項目需求來定製化,我這邊內部使用的話完全是夠用的
在這裏插入圖片描述
好了以後你可以使用Gunicorn提供的命令測試一下服務是否可以正確的運行,來人!搬命令

$ gunicorn app:app -c gunicorn.conf.py

如果你發現出現了錯誤,首先你可以根據它的異常信息提示進行修復(一般無非就是依賴包、環境、版本相關的一些問題)當然!你也可以來騷擾我

  看到這我相信以上的基本操作對於你來講問題不是很大!那麼我們現在需要做的就是需要創建一個Dokcerfile文件,以便構建你的Docker鏡像

FROM python:2.7
WORKDIR /usr/src/Project
COPY requirements.txt ./
RUN pip install -r requirements.txt -i https://pypi.tuna.tsinghua.edu.cn/simple
COPY . .
CMD ["gunicorn", "demo:app", "-c", "./gunicorn.conf.py"]

    Dockerfile中的每一行都是一條命令

  • FORM指定將在其中構建新鏡像的基礎容器鏡像。 這樣一來,你從一個現有的鏡像開始,添加或改變一些東西,並最終得到一個派生的鏡像【這裏選擇的是python2.7)
  • WORKDIR設置將要安裝應用程序的默認目錄【當我在上面創建Project用戶時,會自動創建了一個主目錄,所以現在我將該目錄設置爲默認目錄。 最後在Dockerfile中的任何剩餘命令執行以及運行容器時,其當前目錄都會爲這個默認目錄
  • COPY將文件從你的機器複製到容器文件系統【它需要兩個或更多參數,源文件/目錄和目標文件/目錄。 源文件必須與Dockerfile所在的目錄相關, 目的地可以是絕對路徑
  • RUN執行任意命令, 跟我們在shell下輸入命令相似【創建一個虛擬環境,然後在其中安裝requirements.txt文件中的所有Python依賴
  • CMD當然就是啓動Falsk服務,demo是我們項目啓動文件:啓動應用名變量app

3. 構建鏡像

  完成以上基本操作後,就可以開始構建你的Docker鏡像了,以下使用docker build命令的-t參數設置了新容器鏡像的名稱和標籤。 那個點表示容器構建的基礎目錄,這就是Dockerfile所在的目錄。 構建過程將執行Dockerfile中的所有命令並創建鏡像,該鏡像將存儲在你自己的機器上

$ docker build -t project:latest .

  這個過程需要消耗一點時間,python:2的基礎鏡像它怎麼說也有幾百個M,請給予它應有的尊重。這個時候你可以爲即將到來的勝利泡上一杯苦口的coffee慶祝這美好的時刻。OK!coffee下肚精神爽,下面看看理想狀態下的效果它應該是以下這樣的

看來套路還是熟悉的味道,沒有帶給我們其它的煩惱,也並沒有出現其它異常的狀況。你可以使用docker images這條命令獲取本地鏡像的列表,囉!就是它

$ docker images
REPOSITORY  TAG     IMAGE ID      CREATED       SIZE
project   latest  54a47d0c27cf  12 seconds ago  941MB

4. 構建Docker服務

  最後你只差一步就能完成本次的部署工作,我相信這是個令你激動的時刻,請整理好你的思緒來使用Daemon的方式將你的Docker服務發佈到生產環境中,來!上命令

$ docker run -d -p 5901:5901 --name FalskServer FlaskProject

你可以使用docker ps這條命令獲取當前容器列表,囉!就是下面這個圖,可以看到你的Flask應用已經部署到了Dcoker服務中運行,開心吧!還不趕緊測試一下你的成果
在這裏插入圖片描述
  好的,到這裏你已經掌握瞭如何將你的Flask應用封裝成一個Docker服務,所以在這個過程中我們不僅需要理解Flask應用的常規部署方法,更要掌握容器化部署應用的技巧。你看現在的容器技術多火爆,能不學習嗎?怎麼滴也得學它一招半式喲。如果我們需要規模化的管理大量Dokcer容器時,可以考慮用K8s來做它將會簡化我們更多的工作

3. 致謝

  好了,到這裏又到了跟大家說再見的時候了。我只是一個會寫爬蟲的段子手而已,一個希望有朝一日能夠實現財富自由,能夠早日榮歸故里的遊子罷了。希望我的文章能帶給您知識,帶給您幫助,帶給您歡笑!同時也謝謝您能抽出寶貴的時間閱讀,創作不易,如果您喜歡的話,點個贊再走吧。您的支持是我創作的動力,希望今後能帶給大家更多優質的文章

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章