使用Docker部署Python的Flask項(xiàng)目最新教程
一、構(gòu)建運(yùn)行 Docker 容器
1. 查找合適鏡像
打開(kāi) https://hub.docker.com/_/python/tags 找到合適自己的鏡像,我找到的是 python:3.13.3-alpine3.22
根據(jù)環(huán)境選擇鏡像:
- 開(kāi)發(fā)環(huán)境:使用 python:3.12-buster 或完整鏡像,便于調(diào)試和安裝依賴。
- 生產(chǎn)環(huán)境:使用 python:3.12-slim 或 python:3.12-alpine,減少攻擊面和鏡像體積。
2.本地docker 拉取鏡像
docker pull python:3.13.3-alpine3.22
docker images
3.項(xiàng)目配置
1. python項(xiàng)目下生成 requirements.txt 依賴文件
pip freeze > requirements.txt
文件內(nèi)容:
2. 生成Dockerfile文件
FROM python:3.12.10-alpine3.22 # 設(shè)置工作目錄 WORKDIR /app COPY . . RUN adduser -D appuser # 使用國(guó)內(nèi)鏡像源并增加超時(shí)時(shí)間 RUN pip config set global.index-url https://pypi.tuna.tsinghua.edu.cn/simple # 復(fù)制依賴文件并安裝(添加超時(shí)和重試) COPY requirements.txt . RUN pip install --no-cache-dir \ --timeout 100 \ gunicorn>=21.2.0 \ -r requirements.txt # 驗(yàn)證安裝(關(guān)鍵!) RUN which gunicorn && gunicorn --version USER appuser # 啟動(dòng)命令 CMD ["gunicorn", "-b", "0.0.0.0:5000", "app:app", "--workers", "4", "--threads", "2"]
代碼解釋:
RUN pip config set global.index-url
設(shè)置國(guó)內(nèi)鏡像,更快下載依賴
COPY . .
正式環(huán)境部署時(shí),采用 代碼打包進(jìn)鏡像,數(shù)據(jù)用數(shù)據(jù)卷 的方案
- 避免因宿主機(jī)文件變動(dòng)導(dǎo)致服務(wù)異常
- 容器與宿主機(jī)文件系統(tǒng)隔離,減少攻擊面。
- 日志、配置等數(shù)據(jù)需持久化存儲(chǔ)。
- gunicorn>=21.2.0 強(qiáng)制安裝 Gunicorn(不依賴 requirements.txt)
- 強(qiáng)制安裝 Gunicorn(不依賴 requirements.txt),開(kāi)發(fā)環(huán)境不用安裝 Gunicorn
- CMD [“gunicorn”, “-b”, “0.0.0.0:5000”, “app:app”, “–workers”, “4”, “–threads”, “2”]
- Gunicorn 啟動(dòng) Flask 應(yīng)用
- -b 0.0.0.0:5000 綁定(bind)地址和端口
- 讓 Gunicorn 服務(wù)器在容器內(nèi)部的 5000 端口接收外部請(qǐng)求
- app:app 模塊名:應(yīng)用實(shí)例名
- 第一個(gè) app:Python 文件或模塊名(如 app.py)。
- 第二個(gè) app:Flask 應(yīng)用實(shí)例名(通常在代碼中定義為 app = Flask(name))。
- –workers 4
- 啟動(dòng) 4 個(gè) worker 進(jìn)程(即 4 個(gè)獨(dú)立的 Python 進(jìn)程)
- –threads 2
- 每個(gè) worker 進(jìn)程啟動(dòng) 2 個(gè)線程。
適用場(chǎng)景
這條命令適合 I/O 密集型的 Flask 應(yīng)用,例如:
- API 接口服務(wù)(大量 HTTP 請(qǐng)求)。
- 數(shù)據(jù)庫(kù) CRUD 操作(等待數(shù)據(jù)庫(kù)響應(yīng)時(shí)線程可處理其他請(qǐng)求)。
- 調(diào)用外部 API 的服務(wù)(如調(diào)用第三方支付、短信等)。
3.忽略不必要文件
創(chuàng)建 .dockerignore 文件排除不需要的文件:
__pycache__ *.pyc *.pyo *.pyd .venv Dockerfile .git
4. 構(gòu)建鏡像
在項(xiàng)目根目錄執(zhí)行:
docker build -t flask-api:prod.v1.1 .
- -t:指定鏡像標(biāo)簽(格式:[倉(cāng)庫(kù)名]:[版本號(hào)])
- .:指定構(gòu)建上下文(當(dāng)前目錄)
4. 運(yùn)行容器
docker rm -f flask-api && docker run -d -p 5000:5000 --name flask-api flask-api:prod
- 啟動(dòng)前刪除 flask-api 容器
- -d:后臺(tái)運(yùn)行
- -p 5000:5000 端口映射(主機(jī):容器)
5.測(cè)試
curl http://localhost:5000
二、常見(jiàn)問(wèn)題與解決方案
問(wèn)題:容器啟動(dòng)后立即退出。
原因:主進(jìn)程(如 app.py)未保持運(yùn)行(如腳本執(zhí)行完就退出)。
解決:確保應(yīng)用持續(xù)監(jiān)聽(tīng)端口(如 Flask/Django 服務(wù))。問(wèn)題:依賴安裝失敗(如 Alpine 鏡像缺少編譯工具)。
解決:在 Dockerfile 中添加編譯依賴:RUN apk add --no-cache gcc musl-dev
問(wèn)題:修改代碼后需重新構(gòu)建整個(gè)鏡像。
解決:利用 Docker 緩存,先復(fù)制 requirements.txt 并安裝依賴,再?gòu)?fù)制代碼。
總結(jié)
到此這篇關(guān)于使用Docker部署Python的Flask項(xiàng)目的文章就介紹到這了,更多相關(guān)Docker部署Python Flask項(xiàng)目?jī)?nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
python django框架中使用FastDFS分布式文件系統(tǒng)的安裝方法
這篇文章主要介紹了python-django框架中使用FastDFS分布式文件系統(tǒng)的安裝方法,本文圖文并茂給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值 ,需要的朋友可以參考下2019-06-06使用python編寫(xiě)一個(gè)視覺(jué)巡線程序
這篇文章主要為大家詳細(xì)介紹了如何使用python編寫(xiě)一個(gè)視覺(jué)巡線程序,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下2025-01-01Python實(shí)現(xiàn)Excel文件的合并(以新冠疫情數(shù)據(jù)為例)
這篇將以新冠疫情數(shù)據(jù)為例,詳細(xì)介紹了如何利用Python實(shí)現(xiàn)合并Excel文件,文中的示例代碼講解詳細(xì),感興趣的可以了解一下2022-03-03在PyCharm中找不到Conda創(chuàng)建的環(huán)境的解決方法
本文主要介紹了在PyCharm中找不到Conda創(chuàng)建的環(huán)境的解決方法,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2023-07-07Python3加密解密庫(kù)Crypto的RSA加解密和簽名/驗(yàn)簽實(shí)現(xiàn)方法實(shí)例
這篇文章主要介紹了Python3加密解密庫(kù)Crypto的RSA加解密和簽名/驗(yàn)簽實(shí)現(xiàn)方法實(shí)例,需要的朋友可以參考下2020-02-02python數(shù)據(jù)分析Numpy庫(kù)的常用操作
numpy 是 Python 的一個(gè)科學(xué)計(jì)算的庫(kù),提供了矩陣運(yùn)算的功能,其一般與 Scipy、matplotlib 一起使用,這篇文章總結(jié)下python數(shù)據(jù)分析Numpy庫(kù)的常用操作,感興趣的朋友一起看看吧2022-01-01基于Python實(shí)現(xiàn)簡(jiǎn)單的學(xué)生點(diǎn)名系統(tǒng)
現(xiàn)在的學(xué)生大部分都很積極,會(huì)主動(dòng)舉手回答問(wèn)題。但是,也會(huì)遇到一些不好的情況,比如年級(jí)越高主動(dòng)舉手的人越少,所以本文做了一個(gè)隨機(jī)的學(xué)生點(diǎn)名系統(tǒng)可以幫老師解決這些問(wèn)題2022-09-09Celery批量異步調(diào)用任務(wù)一直等待結(jié)果問(wèn)題
這篇文章主要介紹了Celery批量異步調(diào)用任務(wù)一直等待結(jié)果問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-11-11