Docker+Flask 實戰:打造高并發微服務架構

Docker+Flask 實戰:打造高并發微服務架構

今天我們要深入探討一個非常熱門且實用的主題:基于 Docker 部署 Python Flask 應用。Docker 作為當下最流行的容器化技術,已經廣泛應用于各種開發和部署場景,尤其是在微服務架構中。而 Flask 作為 Python 世界里輕量級的 Web 框架,同樣備受開發者青睞。將二者結合,能極大地提高我們應用的部署效率和可移植性。接下來,我們就一起通過一個完整的實例來學習如何實現這個過程。

測試虛擬機環境介紹

在開始之前,先給大家介紹一下我們使用的測試虛擬機環境。我們使用的是 VMware,配置為 4G 內存和 2 核心。這樣的配置對于我們今天的演示來說是足夠的,當然在實際生產環境中,你可能需要根據具體的應用需求來調整硬件資源。

Docker + Flask 部署實例

1. 項目代碼

首先,我們來看一下 Flask 應用的代碼,它在 app.py 文件中。

from flask import Flask
app = Flask(__name__)@app.route('/')
def hello():return "Hello Docker World!"if __name__ == '__main__':app.run(host='0.0.0.0', port=5000)

這段代碼非常簡單,我們導入了 Flask 框架,創建了一個 Flask 應用實例,然后定義了一個路由 /,當訪問這個路由時,會返回一個簡單的字符串。最后,我們通過 app.run 方法啟動了這個應用,并將其監聽在 0.0.0.0:5000 上,這樣容器內的服務就能監聽所有網絡接口,而不僅僅是本地環回地址。

2. Dockerfile 配置

接下來,我們要在項目根目錄創建一個 Dockerfile

# 使用輕量級 Python 基礎鏡像
FROM python:3.11-slim# 設置工作目錄
WORKDIR /app# 代碼到容器
COPY . .# 安裝依賴(使用國內鏡像加速)
RUN pip install --no-cache-dir -r requirements.txt# 暴露端口
EXPOSE 5000# 啟動命令
CMD ["python", "app.py"]

這里面有幾個關鍵的指令需要大家注意。首先是 FROM python:3.10-slim,我們使用的是官方的輕量級 Python 鏡像,它的體積只有約 127MB,相比 centos 鏡像更加高效,這對于我們構建和部署鏡像來說可以節省很多時間和存儲空間。然后是 --no-cache-dir 這個參數,它的作用是避免緩存依賴,確保每次構建時都能安裝最新版本的依賴。EXPOSE 5000 聲明了容器暴露的端口,不過需要注意的是,這只是一個聲明,實際運行容器時還需要結合 -p 參數將容器端口映射到宿主機上。最后,CMD 指令定義了容器啟動時要執行的命令。

3. 依賴管理

我們還需要創建一個 requirements.txt 文件,用來列出所有的依賴。

Flask==3.0.0

明確指定依賴的版本號是非常重要的,這樣可以避免依賴沖突。建議大家在本地使用虛擬環境進行測試,確保所有依賴都能正常工作后,再進行打包。

4. 構建鏡像

在項目目錄下執行以下命令來構建鏡像:

docker build --no-cache -t my-flask-app .

這里的 --no-cache 參數是強制重新構建鏡像,避免緩存導致依賴未更新。

5. 運行容器

構建好鏡像后,我們就可以啟動容器并映射端口了。

docker run -d --name flask-container -p 8080:5000 my-flask-app

-d 參數表示后臺運行容器,-p 8080:5000 是將宿主機的 8080 端口映射到容器的 5000 端口,--name 則是為容器指定一個名稱,方便我們后續管理。

6. 測試訪問

我們可以通過瀏覽器或終端來訪問我們的應用:

curl http://localhost:8080
# 或
http://127.0.0.1:8080

如果一切正常,你應該能看到 Hello Docker World! 這個輸出。

7. 調試與維護

在實際開發過程中,調試和維護是非常重要的。我們可以通過以下命令來查看容器的日志:

docker logs flask-container

如果需要進入容器的終端進行一些操作,可以使用:

docker exec -it flask-container /bin/bash

當我們修改了 app.py 中的代碼后,需要重新執行 docker builddocker run 命令,或者使用 docker-compose 來簡化這個流程。

完整高級優化實例

文件結構

下面我們來看一個更高級的優化實例,首先看一下文件結構:

.
├── docker-compose.yml      # 編排配置
├── Dockerfile              # 多階段構建
├── app
│   ├── app.py             # Flask 主程序
│   └── requirements.txt   # 精確依賴
└── nginx└── nginx.conf         # 反向代理配置
Dockerfile(含多階段構建)
# 構建階段
FROM python:3.11-slim-bullseye AS builder
WORKDIR /build
COPY app/requirements.txt .
RUN pip install --user --no-cache-dir -r requirements.txt# 運行階段
FROM python:3.11-slim-bullseye
WORKDIR /app# 安全配置
RUN adduser --disabled-password --gecos '' appuser && chown -R appuser:appuser /app
USER appuser# 依賴安裝
# 這里要注意的是 /root/.local 不要寫成 /home/appuser/.local,因為你的系統內沒有這個目錄
# 我是在 root 用戶下執行的操作,所以是/root/.local
COPY --from=builder /root/.local /home/appuser/.local  
ENV PATH=/home/appuser/.local/bin:$PATH# 應用代碼
COPY app .# 健康檢查
HEALTHCHECK --interval=30s --timeout=5s CMD curl -f http://localhost:5000/health || exit 1
# 啟動命令
CMD ["gunicorn", "--bind", "0.0.0.0:5000", "--workers", "9", "--worker-class", "gevent", "app:app"]

這里使用了多階段構建的方式,在構建階段我們只安裝依賴,然后在運行階段將依賴復制過來,并使用非 root 用戶運行應用,提高了容器的安全性。同時,我們還添加了健康檢查,確保容器內的服務正常運行。啟動命令使用了 gunicorn 作為 WSGI 服務器,并使用 gevent 作為工作類,提高了應用的并發性能。

app/app.py(含監控端點)
from flask import Flask
from prometheus_client import generate_latest, Counterapp = Flask(__name__)
REQUEST_COUNTER = Counter('http_requests_total', 'Total HTTP Requests')@app.route('/')
def hello():REQUEST_COUNTER.inc()return "Hello Production Docker World!"@app.route('/health')
def health():return "OK", 200@app.route('/metrics')
def metrics():return generate_latest()

在這個 app.py 中,我們添加了一些監控端點。/health 端點用于健康檢查,/metrics 端點用于提供 Prometheus 監控數據,這樣我們就能更好地監控應用的運行狀態。

app/requirements.txt(精確版本控制)
Flask==3.0.0
gunicorn==21.2.0
gevent==23.9.1
prometheus-client==0.20.0

精確控制依賴的版本號可以避免因依賴版本不一致而導致的問題。

docker-compose.yml(生產編排)
version: '3.11'services:web:build: .ports:- "5000:5000"deploy:resources:limits:cpus: '2.0'memory: 1GBlogging:driver: "json-file"options:max-size: "100m"nginx:image: nginx:1.25ports:- "80:80"volumes:- ./nginx/nginx.conf:/etc/nginx/nginx.confdepends_on:- web

docker-compose.yml 是用于生產編排的,我們可以通過它來定義多個服務,并進行資源管控和日志配置。這里我們定義了 webnginx 兩個服務,web 服務構建我們的 Flask 應用,nginx 服務作為反向代理,將請求轉發到 web 服務上。

nginx/nginx.conf(反向代理配置)
worker_processes auto;events {worker_connections 1024;
}http {upstream flask {server web:5000;}server {listen 80;location / {proxy_pass http://flask;proxy_set_header Host $host;proxy_set_header X-Real-IP $remote_addr;}}
}

這個 nginx.conf 文件配置了反向代理,將所有請求轉發到 web 服務的 5000 端口上。

部署流程
# 構建鏡像
docker-compose build# 啟動集群
docker-compose up -d# 驗證部署
curl http://localhost/health

通過這幾個簡單的命令,我們就可以完成整個應用的部署和驗證。

關鍵優化點說明

最后,我們來看一下這個高級優化實例的關鍵優化點:

優化方向實現方案
?鏡像體積?多階段構建(162MB 鏡像)
?并發性能?Gunicorn + Gevent(9 workers)
?安全基線?非 root 用戶運行 + 文件權限控制
?可觀測性?Prometheus 監控端點 + 健康檢查
?資源管控?CPU/內存限制 + 日志滾動策略

我們還進行了壓力測試,所有參數均通過 wrk -t12 -c400 -d30s http://localhost/ 壓力測試驗證,QPS 為1125,可能是虛擬機的原因吧。

下面的幾個版本的對比:

鏡像組件鏡像大小QPS
flask-app:v1Python:3.11 +Flask3.0138MB1000.95
flask-app:v2Python:3.11-alpine +Flask3.058.6MB899.78
flask-nginx-web:v1Python:3.11-slim-bullseye +Flask3.0+gunicorn21.2.0+
gevent23.9.1+prometheus-client0.20.0
162MB1125.04
flask-nginx-web:v2Python:3.11-alpine +Flask3.0+gunicorn21.2.0+
gevent23.9.1+prometheus-client0.20.0
92.7MB1049.89

alpin鏡像確實小,從QPS的角度來看,并不是什么都用alpin鏡像就好的。

總結

今天我們學習了如何基于 Docker 部署 Python Flask 應用,從簡單的實例到高級優化實例,希望大家能對 Docker 的使用有更深入的理解。在實際開發中,大家可以根據自己的需求進行調整和優化,充分發揮 Docker 的優勢。如果大家有任何問題,歡迎隨時提問。謝謝大家!

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/bicheng/73414.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/73414.shtml
英文地址,請注明出處:http://en.pswp.cn/bicheng/73414.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Linux find 命令完全指南

find 是 Linux 系統最強大的文件搜索工具&#xff0c;支持 嵌套遍歷、條件篩選、執行動作。以下通過場景分類解析核心用法&#xff0c;涵蓋高效搜索、文件管理及高級技巧&#xff1a; 一、基礎搜索模式 1. 按文件名搜索&#xff08;精確/模糊匹配&#xff09; <BASH> f…

【量化策略】趨勢跟蹤策略

【量化策略】趨勢跟蹤策略 &#x1f680;量化軟件開通 &#x1f680;量化實戰教程 技術背景與應用場景 在金融市場中&#xff0c;趨勢跟蹤策略是一種基于市場趨勢進行交易的量化投資方法。該策略的核心思想是“順勢而為”&#xff0c;即認為市場價格會沿著一定的方向持續移…

AI自動化、資本短視、三輸與破局

當前AI應用中的一個深層矛盾&#xff1a;工程師使用AI將很專業的任務變成小白可以操作的工作&#xff0c;然后資本方給小白很少的錢把工程師裁掉了&#xff0c;然而小白不懂底層&#xff0c;出問題幾乎無法修復。由此&#xff0c;技術普及與專業能力之間的斷層引發了"三輸…

Python數據分析之數據可視化

Python 數據分析重點知識點 本系列不同其他的知識點講解&#xff0c;力求通過例子讓新同學學習用法&#xff0c;幫助老同學快速回憶知識點 可視化系列&#xff1a; Python基礎數據分析工具數據處理與分析數據可視化機器學習基礎 四、數據可視化 圖表類型與選擇 根據數據特…

簡述計算機網絡中的七層模型和四層模型

在計算機網絡中&#xff0c;網絡協議棧的設計通常采用分層結構來處理不同的通信任務。常見的分層結構有OSI七層模型和TCP/IP四層模型。雖然它們的層次數量不同&#xff0c;但本質上都在解決如何有效地進行計算機間通信。本文將分別介紹這兩種結構的功能和各層的協議。 一、OSI七…

2025高頻面試算法總結篇【持續更新中】

文章目錄 遞歸&回溯131. 分割回文串面試題 08.12. 八皇后 動態規劃72編輯距離5. 最長回文子串279. 完全平方數300. 最長遞增子序列 遞歸&回溯 131. 分割回文串 回溯思路&#xff1a; 臨界條件&#xff1a; if (start s.length) > 保存 循環遍歷這個字串 for (int…

【大模型學習】第二十二章 什么是對抗生成網絡

目錄 一、背景介紹 二、生活化例子說明什么是對抗生成網絡 三、技術細節詳解 &#xff08;一&#xff09;基本概念 &#xff08;二&#xff09;訓練機制 &#xff08;三&#xff09;損失函數 一、背景介紹 對抗生成網絡&#xff08;Generative Adversarial Networks, GANs…

攝像頭模塊ISP處理流程

攝像頭模塊的ISP&#xff08;圖像信號處理器&#xff09;處理流程是對圖像傳感器輸出的原始信號進行系統性優化的過程&#xff0c;主要分為以下關鍵步驟及對應功能模塊&#xff1a; 一、原始信號輸入與預處理 ?傳感器信號捕獲? CMOS/CCD傳感器將光信號轉換為模擬電信號&…

linux系統安裝和激活conda

安裝 wget https://repo.anaconda.com/miniconda/Miniconda3-latest-Linux-x86_64.shbash ./Miniconda3-latest-Linux-x86_64.sh回車到最后按照輸入yes&#xff0c;之后按提示操作。 激活 conda activate如果沒有反應或者返回&#xff1a; bash: conda: command not found則…

(全)2024下半年真題 系統架構設計師 綜合知識 答案解析02

系統架構設計師第二版教程VIP課程https://edu.csdn.net/course/detail/40283 面向對象技術 在UML用例圖中&#xff0c;參與者之間存在 關系。 A. 聚合 B. 包含 C. 繼承 D. 擴展 答案&#xff1a;C 解析&#xff1a;用例圖描述了一組用例、參與者以及它們之間的關系…

【學習筆記】《逆向工程核心原理》03.abex‘crackme-2、函數的調用約定、視頻講座-Tut.ReverseMe1

文章目錄 abexcrackme-21. Visual Basic文件的特征1.1. VB專用引擎1.2. 本地代碼與偽代碼1.3. 事件處理程序1.4. 未文檔化的結構體 2. 開始調試2.1. 間接調用2.2. RT_MainStruct結構體2.3. ThunRTMain()函數 3. 分析crackme3.1. 檢索字符串3.2. 查找字符串地址3.3. 生成Serial的…

深入解析Go語言Channel:源碼剖析與并發讀寫機制

文章目錄 Channel的內部結構Channel的創建過程有緩沖Channel的并發讀寫機制同時讀寫的可能性發送操作的實現接收操作的實現 并發讀寫的核心機制解析互斥鎖保護環形緩沖區等待隊列直接傳遞優化Goroutine調度 實例分析&#xff1a;有緩沖Channel的并發讀寫性能優化與最佳實踐緩沖…

初識Linux(14)Ext系列?件系統

之前談論的都是已打開文件在操作系統的中的管理&#xff0c;但是還有更多的文件沒有被打開&#xff0c;被存在磁盤中&#xff0c;如何管理這些磁盤中的文件&#xff0c;就是本篇的學習目標。 目錄 1.理解硬件 磁盤結構 扇區的讀寫 CHS地址定位 磁盤的邏輯結構 2. 引??件…

電機控制常見面試問題(十二)

文章目錄 一.電機鎖相環1.理解鎖相環2.電機控制中的鎖相環應用3.數字鎖相環&#xff08;DPLL&#xff09; vs 模擬鎖相環&#xff08;APLL&#xff09;4.鎖相環設計的關鍵技術挑戰5.總結 二、磁鏈觀測1.什么是磁鏈&#xff1f;2.為什么要觀測磁鏈&#xff1f;3.怎么觀測磁鏈&am…

Android `%d` 與 `1$%d` 格式化的區別

在 Android 開發中&#xff0c;我們經常需要對字符串進行格式化處理&#xff0c;比如動態填充數字、日期、字符等。 其中&#xff0c;%d 和 1$%d 都是格式化占位符&#xff0c;但它們在使用上有一些不同。 本文將詳細解析這兩者的區別&#xff0c;并結合 Kotlin 代碼示例幫助你…

SpringBoot中使用kaptcha生成驗證碼

簡介 kaptcha是谷歌開源的簡單實用的驗證碼生成工具。通過設置參數&#xff0c;可以自定義驗證碼大小、顏色、顯示的字符等等。 Maven引入依賴 <!-- https://mvnrepository.com/artifact/pro.fessional/kaptcha --><dependency><groupId>pro.fessional<…

如何在PHP中實現數據加密與解密:保護敏感信息

如何在PHP中實現數據加密與解密&#xff1a;保護敏感信息 在現代Web開發中&#xff0c;數據安全是一個至關重要的議題。無論是用戶的個人信息、支付數據&#xff0c;還是其他敏感信息&#xff0c;都需要在存儲和傳輸過程中進行加密&#xff0c;以防止數據泄露和惡意攻擊。PHP作…

單元測試、系統測試、集成測試、回歸測試的步驟、優點、缺點、注意點梳理說明

單元測試、系統測試、集成測試、回歸測試的梳理說明 單元測試 步驟&#xff1a; 編寫測試用例&#xff0c;覆蓋代碼的各個分支和邊界條件。使用測試框架&#xff08;如JUnit、NUnit&#xff09;執行測試。檢查測試結果&#xff0c;確保代碼按預期運行。修復發現的缺陷并重新測…

C++能力測試題

以下是一些C能力測試題&#xff0c;涵蓋了從基礎語法到高級特性的多個方面&#xff1a; 選擇題 1. 下面關于RTTI的說法&#xff0c;正確的是&#xff1f; A. 使用typeid前必須包含<type_info>頭文件。 B. typeid只能用于多態類型或表達式。 C. typeid可以用于不完整類型…

模擬類似 DeepSeek 的對話

以下是一個完整的 JavaScript 數據流式獲取實現方案&#xff0c;模擬類似 DeepSeek 的對話式逐段返回效果。包含前端實現、后端模擬和詳細注釋&#xff1a; <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><titl…