使用Docker部署Python的Flask項目最新教程
一、構(gòu)建運行 Docker 容器
1. 查找合適鏡像
打開 https://hub.docker.com/_/python/tags 找到合適自己的鏡像,我找到的是 python:3.13.3-alpine3.22
根據(jù)環(huán)境選擇鏡像:
- 開發(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.項目配置
1. python項目下生成 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
# 使用國內(nèi)鏡像源并增加超時時間
RUN pip config set global.index-url https://pypi.tuna.tsinghua.edu.cn/simple
# 復(fù)制依賴文件并安裝(添加超時和重試)
COPY requirements.txt .
RUN pip install --no-cache-dir \
--timeout 100 \
gunicorn>=21.2.0 \
-r requirements.txt
# 驗證安裝(關(guān)鍵?。?
RUN which gunicorn && gunicorn --version
USER appuser
# 啟動命令
CMD ["gunicorn", "-b", "0.0.0.0:5000", "app:app", "--workers", "4", "--threads", "2"]
代碼解釋:
RUN pip config set global.index-url設(shè)置國內(nèi)鏡像,更快下載依賴
COPY . .正式環(huán)境部署時,采用 代碼打包進(jìn)鏡像,數(shù)據(jù)用數(shù)據(jù)卷 的方案
- 避免因宿主機文件變動導(dǎo)致服務(wù)異常
- 容器與宿主機文件系統(tǒng)隔離,減少攻擊面。
- 日志、配置等數(shù)據(jù)需持久化存儲。
- gunicorn>=21.2.0 強制安裝 Gunicorn(不依賴 requirements.txt)
- 強制安裝 Gunicorn(不依賴 requirements.txt),開發(fā)環(huán)境不用安裝 Gunicorn
- CMD [“gunicorn”, “-b”, “0.0.0.0:5000”, “app:app”, “–workers”, “4”, “–threads”, “2”]
- Gunicorn 啟動 Flask 應(yīng)用
- -b 0.0.0.0:5000 綁定(bind)地址和端口
- 讓 Gunicorn 服務(wù)器在容器內(nèi)部的 5000 端口接收外部請求
- app:app 模塊名:應(yīng)用實例名
- 第一個 app:Python 文件或模塊名(如 app.py)。
- 第二個 app:Flask 應(yīng)用實例名(通常在代碼中定義為 app = Flask(name))。
- –workers 4
- 啟動 4 個 worker 進(jìn)程(即 4 個獨立的 Python 進(jìn)程)
- –threads 2
- 每個 worker 進(jìn)程啟動 2 個線程。
適用場景
這條命令適合 I/O 密集型的 Flask 應(yīng)用,例如:
- API 接口服務(wù)(大量 HTTP 請求)。
- 數(shù)據(jù)庫 CRUD 操作(等待數(shù)據(jù)庫響應(yīng)時線程可處理其他請求)。
- 調(diào)用外部 API 的服務(wù)(如調(diào)用第三方支付、短信等)。
3.忽略不必要文件
創(chuàng)建 .dockerignore 文件排除不需要的文件:
__pycache__ *.pyc *.pyo *.pyd .venv Dockerfile .git
4. 構(gòu)建鏡像
在項目根目錄執(zhí)行:
docker build -t flask-api:prod.v1.1 .
- -t:指定鏡像標(biāo)簽(格式:[倉庫名]:[版本號])
- .:指定構(gòu)建上下文(當(dāng)前目錄)

4. 運行容器
docker rm -f flask-api && docker run -d -p 5000:5000 --name flask-api flask-api:prod
- 啟動前刪除 flask-api 容器
- -d:后臺運行
- -p 5000:5000 端口映射(主機:容器)
5.測試
curl http://localhost:5000
二、常見問題與解決方案
問題:容器啟動后立即退出。
原因:主進(jìn)程(如 app.py)未保持運行(如腳本執(zhí)行完就退出)。
解決:確保應(yīng)用持續(xù)監(jiān)聽端口(如 Flask/Django 服務(wù))。問題:依賴安裝失?。ㄈ?Alpine 鏡像缺少編譯工具)。
解決:在 Dockerfile 中添加編譯依賴:RUN apk add --no-cache gcc musl-dev
問題:修改代碼后需重新構(gòu)建整個鏡像。
解決:利用 Docker 緩存,先復(fù)制 requirements.txt 并安裝依賴,再復(fù)制代碼。
總結(jié)
到此這篇關(guān)于使用Docker部署Python的Flask項目的文章就介紹到這了,更多相關(guān)Docker部署Python Flask項目內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
python django框架中使用FastDFS分布式文件系統(tǒng)的安裝方法
這篇文章主要介紹了python-django框架中使用FastDFS分布式文件系統(tǒng)的安裝方法,本文圖文并茂給大家介紹的非常詳細(xì),具有一定的參考借鑒價值 ,需要的朋友可以參考下2019-06-06
Python實現(xiàn)Excel文件的合并(以新冠疫情數(shù)據(jù)為例)
這篇將以新冠疫情數(shù)據(jù)為例,詳細(xì)介紹了如何利用Python實現(xiàn)合并Excel文件,文中的示例代碼講解詳細(xì),感興趣的可以了解一下2022-03-03
在PyCharm中找不到Conda創(chuàng)建的環(huán)境的解決方法
本文主要介紹了在PyCharm中找不到Conda創(chuàng)建的環(huán)境的解決方法,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2023-07-07
Python3加密解密庫Crypto的RSA加解密和簽名/驗簽實現(xiàn)方法實例
這篇文章主要介紹了Python3加密解密庫Crypto的RSA加解密和簽名/驗簽實現(xiàn)方法實例,需要的朋友可以參考下2020-02-02
python數(shù)據(jù)分析Numpy庫的常用操作
numpy 是 Python 的一個科學(xué)計算的庫,提供了矩陣運算的功能,其一般與 Scipy、matplotlib 一起使用,這篇文章總結(jié)下python數(shù)據(jù)分析Numpy庫的常用操作,感興趣的朋友一起看看吧2022-01-01
基于Python實現(xiàn)簡單的學(xué)生點名系統(tǒng)
現(xiàn)在的學(xué)生大部分都很積極,會主動舉手回答問題。但是,也會遇到一些不好的情況,比如年級越高主動舉手的人越少,所以本文做了一個隨機的學(xué)生點名系統(tǒng)可以幫老師解決這些問題2022-09-09
Celery批量異步調(diào)用任務(wù)一直等待結(jié)果問題
這篇文章主要介紹了Celery批量異步調(diào)用任務(wù)一直等待結(jié)果問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2023-11-11

