Flask輕量級部署:Docker容器化快速上線

在開發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應用將擁有“一次打包,到處運行”的能力,部署效率和穩定性將大幅提升!

小夜