在開發Web應用時,我們常常會遇到一個問題:“爲什麼我的代碼在本地運行好好的,到了服務器就不行了?” 這通常是因爲開發環境和生產環境的差異,比如Python版本、依賴庫版本、系統配置不同等。Docker容器化技術能完美解決這個問題,讓你的Flask應用在任何支持Docker的環境中“開箱即用”。
爲什麼選擇Docker容器化部署?¶
傳統部署方式需要手動在服務器上配置Python環境、安裝依賴、啓動服務,容易出錯且難以復現。而Docker容器化就像給應用打包了一個“完整的操作系統快照”,無論在開發機、服務器還是雲平臺,只要Docker環境一致,應用就能以相同的方式運行。
核心優勢:
- 環境一致:開發、測試、生產環境完全相同,避免“在我電腦上能跑”的玄學問題
- 隔離性:容器之間相互隔離,互不影響
- 輕量化:相比虛擬機,容器資源佔用更少
- 快速部署:一行命令即可啓動整個應用棧
快速上手:Docker容器化你的第一個Flask應用¶
步驟1:準備Flask應用¶
首先,創建一個最簡單的Flask應用。新建文件app.py:
from flask import Flask
app = Flask(__name__)
@app.route('/')
def hello():
return "Hello, Dockerized Flask App!"
if __name__ == '__main__':
app.run(host='0.0.0.0', port=5000)
再創建requirements.txt(列出依賴):
Flask==2.3.3
步驟2:編寫Dockerfile¶
在項目根目錄創建Dockerfile(無後綴名),內容如下:
# 基礎鏡像:使用官方Python 3.9版本,slim版本體積更小
FROM python:3.9-slim
# 設置工作目錄,相當於進入容器後的默認路徑
WORKDIR /app
# 複製依賴文件到容器
COPY requirements.txt .
# 安裝依賴(--no-cache-dir 避免緩存佔用空間)
RUN pip install --no-cache-dir -r requirements.txt
# 複製當前目錄文件到容器工作目錄
COPY . .
# 設置環境變量:指定Flask入口文件和運行環境
ENV FLASK_APP=app.py
ENV FLASK_ENV=production
# 暴露容器內的5000端口(僅聲明,實際映射需在運行時指定)
EXPOSE 5000
# 啓動命令:運行Flask應用
CMD ["flask", "run", "--host=0.0.0.0"]
步驟3:構建Docker鏡像¶
在項目目錄執行以下命令構建鏡像(.表示當前目錄,注意末尾有個點):
docker build -t myflaskapp .
-t myflaskapp:給鏡像打標籤(myflaskapp是鏡像名,可自定義)docker build:告訴Docker根據Dockerfile構建鏡像
構建成功後,可通過docker images查看鏡像列表,找到名爲myflaskapp的鏡像。
步驟4:運行Docker容器¶
使用構建好的鏡像啓動容器:
docker run -p 5000:5000 myflaskapp
-p 5000:5000:將容器內的5000端口映射到本地5000端口- 此時訪問
http://localhost:5000,就能看到Flask應用返回的“Hello, Dockerized Flask App!”
步驟5:停止容器¶
按Ctrl+C停止容器,如需後臺運行(守護模式),可加-d參數:
docker run -d -p 5000:5000 --name myflaskcontainer myflaskapp
如需停止運行中的容器:
docker stop myflaskcontainer # 停止容器
docker rm myflaskcontainer # 刪除已停止容器(可選)
進階技巧:讓部署更專業¶
1. 優化鏡像體積(多階段構建)¶
上面的Dockerfile直接使用基礎鏡像,可能體積較大。可通過多階段構建減小鏡像:
# 階段1:構建階段
FROM python:3.9-slim AS builder
WORKDIR /app
COPY requirements.txt .
RUN pip wheel --no-cache-dir --no-deps --wheel-dir /app/wheels -r requirements.txt
# 階段2:運行階段
FROM python:3.9-slim
WORKDIR /app
COPY --from=builder /app/wheels /wheels
RUN pip install --no-cache /wheels/*
COPY . .
ENV FLASK_APP=app.py
EXPOSE 5000
CMD ["flask", "run", "--host=0.0.0.0"]
2. 數據持久化(避免文件丟失)¶
如果應用需要保存用戶上傳文件或數據庫數據,可通過Docker卷掛載:
# 創建數據卷
docker volume create flask_data
# 運行容器時掛載卷(將容器內/app/data目錄映射到數據卷)
docker run -d -p 5000:5000 -v flask_data:/app/data myflaskapp
3. 環境變量管理(敏感信息不硬編碼)¶
創建.env文件(不要提交到代碼庫):
FLASK_SECRET_KEY=your_secret_key_here
DATABASE_URI=sqlite:////app/data/db.sqlite
在Dockerfile中引用環境變量:
# 在Dockerfile中設置默認環境變量(開發用)
ENV FLASK_APP=app.py
ENV FLASK_ENV=production
# 運行時通過-e參數覆蓋
docker run -e FLASK_SECRET_KEY=prod_key -p 5000:5000 myflaskapp
總結¶
Docker容器化部署Flask應用,讓你徹底擺脫“環境依賴”的困擾。核心流程是:編寫Dockerfile → 構建鏡像 → 運行容器。通過多階段構建、數據卷、環境變量等技巧,能讓部署更穩定、更安全。
初學者必做:嘗試將自己的Flask應用用Docker打包,體驗“一次構建,到處運行”的快樂!
常見問題Q&A¶
-
Q:如何查看容器日誌?
A:docker logs 容器ID或名稱 -
Q:修改代碼後如何重新部署?
A:重新構建鏡像:docker build -t myflaskapp .,然後重啓容器 -
Q:沒有Docker Desktop怎麼辦?
A:Windows/Mac需安裝Docker Desktop,Linux可參考官方文檔安裝Docker引擎
通過Docker容器化,你的Flask應用將擁有“一次打包,到處運行”的能力,部署效率和穩定性將大幅提升!