群暉NAS通過docker部署Flask

在Docker中部署應(yīng)用的基本原理

Application 運(yùn)行于系統(tǒng)之上,也可以運(yùn)行在虛擬機(jī)和容器中,下圖簡要說明了這種逐步演變的趨勢:

最開始,Application 直接運(yùn)行在物理機(jī)上面。有了虛擬機(jī)之后,application 可以部署在虛擬機(jī)上,而 Docker 之類的容器出現(xiàn),application 可以部署在 docker 中。容器與虛擬機(jī)比較,更加輕量。虛擬機(jī)是計算機(jī)系統(tǒng)的仿真,每個 VM 不僅運(yùn)行操作系統(tǒng)的完整副本,還運(yùn)行操作系統(tǒng)需要運(yùn)行的所有硬件的虛擬副本,因此可能占用大量的系統(tǒng)資源。而容器只是虛擬化操作系統(tǒng)。容器位于物理服務(wù)器及其主機(jī)操作系統(tǒng)之上 - 通常是Linux或Windows。每個容器共享主機(jī)操作系統(tǒng)內(nèi)核,共享操作系統(tǒng)資源(如庫)可以顯著減少重現(xiàn)操作系統(tǒng)代碼的需要,并且意味著服務(wù)器可以通過單個操作系統(tǒng)安裝來運(yùn)行多個工作負(fù)載。因此容器非常輕 - 它們只有幾兆字節(jié),只需幾秒鐘即可啟動。

制作自己的容器需要以基礎(chǔ)鏡像為基礎(chǔ),加上特定的功能。比如,能夠運(yùn)行 Flask 應(yīng)用程序的容器,需要有 Python,需要有第三方的各種庫或包,如sqlalchemy 等。所以為了方便,我們選擇一個包含 python 的鏡像作為基礎(chǔ)鏡像,以此為基礎(chǔ)制作一個新的鏡像。

基礎(chǔ)鏡像選擇

選擇 python 3.6 stretch 為基礎(chǔ)鏡像(image)。我開始的時候選擇了 Alpine 作為基礎(chǔ)鏡像,但 pip 安裝第三方庫的時候出現(xiàn)錯誤,比如安裝 greenlet 庫。后根據(jù)網(wǎng)上查找到 stackoverflow 帖子提示用 stretch 版,最終選擇 3.6-stretch。

Python 基礎(chǔ)鏡像選擇:

Alpine Linux ,最初是為小型設(shè)備設(shè)計的操作系統(tǒng),因此往往有小包裝。
Debian Stretch ,安裝了許多常見軟件包。鏡像本身很大,但理論上這些軟件包是通過其他Docker鏡像將使用的公共鏡像層安裝的,因此整體磁盤使用率會很低。
Debian Stretch slim 版。這缺少了通用軟件包的層,因此鏡像本身要小得多,但如果你使用Stretch以外的許多其他Docker鏡像,整體磁盤使用量會更高一些。

為什么你不應(yīng)該使用Alpine Linux?

對于想要小鏡像的人來說,一個常見的建議是使用Alpine Linux,但使用它會產(chǎn)生一些問題。首先,Alpine的庫比我上面提到的其他Linux發(fā)行版少得多,因此你可能會缺少庫。
Alpine和其他Linux發(fā)行版之間也存在重大差異:Alpine使用不同的C庫,而不是更常見的glibc。 理論上,musl和glibc 大多是兼容的,但這些差異可能會導(dǎo)致奇怪的問題。

編寫 Dockerfile 文件

Dockerfile 是一個文本文件,其內(nèi)包含了一條條的指令(Instruction),有了 Dockerfile,就可以創(chuàng)建我們所需要的鏡像。編寫一個簡單的 flask 項(xiàng)目,項(xiàng)目的文件結(jié)構(gòu)如下:

將項(xiàng)目的依賴包放到 requirements.txt 文件中,可以使用 pip freeze > requirements.txt 生成然后再刪除不相關(guān)的包。

Flask==2.0.1
Flask-Bootstrap==3.3.7.1
Flask-Cors==3.0.10
Flask-Migrate==3.1.0
Flask-SQLAlchemy==2.5.1
Flask-WTF==0.15.1
WTForms==2.3.3

Dockerfile 文件內(nèi)容如下:

FROM python:3.6-stretch

WORKDIR /app
ADD . /app

RUN pip install -r requirements.txt -i https://pypi.tuna.tsinghua.edu.cn/simple

CMD [ "python", "main.py" ]    

制作鏡像

將項(xiàng)目源碼拷貝到群暉NAS,放在 docker/flasktest/notebook-flask 文件夾中。

啟用群暉 SSH 功能,在 Windows 中通過 putty 或者使用 ssh 命令進(jìn)入群暉系統(tǒng),按下面的步驟制作鏡像文件:

ssh -p 22 admin@192.168.3.21 # 以 admin身份登錄ssh, 端口為22
sudo -i 切換為root賬號
cd /volume3/docker/flasktest/notebook-flask # 進(jìn)入Dockerfile所在目錄
docker build -t notebooklask .  # 在當(dāng)前文件夾下制作鏡像文件

啟動鏡像

在群暉的Docker中啟動鏡像即可。因?yàn)槿簳熓褂?5000 端口,所以我在 main.py 中將端口改為 5050,另外為了能從其它 IP 地址訪問,host 改為 0.0.0.0:

from app import create_app

app = create_app()

if __name__ == '__main__':
    app.run(host="0.0.0.0", port="5050", debug=False)

Flask 在開發(fā)環(huán)境中基于 werkzeug,并不適合在實(shí)際環(huán)境中作為 web server。本例為了簡單和易于理解,未使用 nginx 來部署 Flask 應(yīng)用。如果想了解如何基于 nginx 來部署 flask, 請參考我之前所寫如何在 Linux 環(huán)境下部署 Flask 博文。

啟動后在瀏覽器中測試:

源碼

notebook-flask · stonewm/flask-practice-projects - 碼云 - 開源中國

參考

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容