容器化 Docker 部署與 Render 上線
當你在自己的電腦上(http://127.0.0.1:8000)測試完所有 API 後,你會遇到一個問題:要怎麼把這包程式碼丟到真正的伺服器上跑?
過去,你可能需要租一台 Linux 機器,自己連進去安裝 Python、裝套件庫、設定環境變數,搞得灰頭土臉。而且,一旦換了一台機器,或是要在別人的電腦上跑,你又要重來一次(經典名言:"It works on my machine!")。
為了解決這個問題,業界目前的標準答案就是:Docker。
1. 什麼是 Docker 容器化?
你可以把 Docker 想像成一個「超級貨櫃」。 你把你寫好的 FastAPI 程式碼,連同它需要的 Python 環境、套件版本,全部打包進這個貨櫃裡。 只要伺服器上有安裝 Docker,不管它是什麼作業系統,這個貨櫃放上去就能跑,保證環境 100% 一致。
2. 撰寫 Dockerfile
要打包貨櫃,我們需要寫一張說明書,這張說明書就叫做 Dockerfile(檔名沒有副檔名)。
請在你的 FastAPI 專案根目錄下建立它:
# 步驟 1: 指定基礎映像檔 (基於輕量級的 Python 3.10)
FROM python:3.10-slim
# 步驟 2: 設定工作目錄
WORKDIR /app
# 步驟 3: 將套件清單複製到容器內
COPY requirements.txt .
# 步驟 4: 安裝所有需要的套件
RUN pip install --no-cache-dir -r requirements.txt
# 步驟 5: 將專案內所有的程式碼複製到容器內
COPY . .
# 步驟 6: 對外開放 8000 port
EXPOSE 8000
# 步驟 7: 指定容器啟動時要執行的指令
CMD ["uvicorn", "main:app", "--host", "0.0.0.0", "--port", "8000"]
[!WARNING] 千萬別忘了
requirements.txtDocker 是一個乾淨的環境,它裡面什麼套件都沒有。你必須先在本地終端機執行pip freeze > requirements.txt,把你有用到的套件清單列出來,Docker 才會知道要安裝什麼。 還有,CMD 中的--host 0.0.0.0非常重要,如果不加這個,你的 API 只能在容器內部被呼叫,外部網路連不進來!
3. 本地端測試 Docker Image
如果你有在電腦上安裝 Docker Desktop,你可以先在本地端測試打包:
# 建立一個名為 my-fastapi-app 的映像檔
docker build -t my-fastapi-app .
# 將映像檔跑起來,把本機的 8080 port 映射到容器內的 8000 port
docker run -d -p 8080:8000 my-fastapi-app
現在,打開瀏覽器輸入 http://localhost:8080/docs,如果能看到你的 API 文件,恭喜你打包成功了!
4. 零成本部署至 Render
打包好之後,我們要找一個平台來託管它。
Render 是一個對開發者非常友善的雲端平台,它支援直接從 GitHub 讀取你的 Dockerfile 並自動幫你把服務跑起來,而且有提供免費的方案!
部署步驟:
- 推上 GitHub:把你的專案程式碼(包含
Dockerfile和requirements.txt)推送到 GitHub 上。 - 登入 Render:前往 Render.com 註冊帳號並授權連接你的 GitHub。
- 建立 Web Service:
- 點擊 "New +" -> "Web Service"。
- 選擇 "Build and deploy from a Git repository"。
- 選擇你剛剛推上去的 Repo。
- 設定部署選項:
- Name: 取個好聽的名字(這會成為你網址的一部分)。
- Environment: 選擇
Docker(這非常重要,告訴 Render 我們有提供 Dockerfile)。 - Instance Type: 選擇
Free。
- 環境變數 (Environment Variables):
如果你有使用 JWT Secret Key 或是資料庫連線字串,請在 Render 頁面下方的 "Environment Variables" 區塊把這些金鑰填進去,絕對不要把
.env檔案 commit 到 GitHub 上! - Deploy!
點下建立後,Render 就會開始讀取你的 Dockerfile,拉取 Python 環境,安裝套件,並啟動 Uvicorn。大約等個 3 到 5 分鐘,綠色的 "Live" 亮起,你的 API 伺服器就正式上線了!
你可以得到一個類似 https://my-fastapi-app.onrender.com 的網址,全世界的前端都可以透過這個網址來呼叫你的 API。
5. 架構回顧與未來展望
恭喜你!你已經完成了從零到一打造現代微服務的旅程。 這套由 FastAPI + Pydantic + SQLAlchemy + JWT + Docker 組成的後端架構,正是目前許多 AI 新創公司(甚至包含 OpenAI 的某些服務)正在使用的技術堆疊。
這套武器不僅讓你具備了極佳的開發速度與防護力,更讓你具備了接下大型外包專案、或是自己創業打造 SaaS 的能力。
接下來,就是讓你的 Next.js 前端應用接上這個強大的引擎,讓世界看見你的作品!
更多部署選項
Railway.app
# Railway CLI 部署
railway login
railway init
railway up
Google Cloud Run
gcloud builds submit --tag gcr.io/PROJECT/api
gcloud run deploy api --image gcr.io/PROJECT/api --platform managed
Container 最佳化技巧
- 使用
.dockerignore排除不需要的檔案(__pycache__,.git,venv) - 將
requirements.txt複製到映像檔中時,先安裝依賴再複製程式碼,利用 Docker 層快取 - 使用
gunicorn作為生產環境的 WSGI 伺服器,設定適當的 worker 數量
Container + Render:快速部署微服務
Docker 讓你的應用可以在任何環境一致地執行——不會有「在我電腦可以跑」的問題。Render 提供免費的雲端託管,支援 Docker 部署。
Dockerfile
FROM python:3.11-slim
WORKDIR /app
# 先複製依賴檔案,利用 Docker 快取
COPY requirements.txt .
RUN pip install --no-cache-dir -r requirements.txt
# 複製程式碼
COPY . .
# 啟動
CMD ["uvicorn", "main:app", "--host", "0.0.0.0", "--port", "8000"]
Render 部署步驟
- 將程式碼推送到 GitHub
- 登入 https://render.com
- 點選「New +」→「Web Service」
- 連結你的 GitHub Repo
- 設定 Build Command:
pip install -r requirements.txt - 設定 Start Command:
uvicorn main:app --host 0.0.0.0 --port $PORT - 設定環境變數(SECRET_KEY、DATABASE_URL 等)
- 點選「Create」→ 等待部署完成
課程總結
這堂 FastAPI 微服務課程你從第一支 API、SQLAlchemy、Pydantic、JWT 認證到 Docker 部署——你現在可以獨立開發並上線一個 production-ready 的 Python API 服務了。