iT邦幫忙

2025 iThome 鐵人賽

DAY 9
1
DevOps

DevOps 進化論:從全能型戰士到安全守門員系列 第 9

Day 9|Docker 容器化與映像檔建立(打包專案)

  • 分享至 

  • xImage
  •  

● 前言

▪ 在前一篇,我們將 效能測試 整合至 CI Pipeline(GitHub Actions),並利用 Locust 產出壓測報表。到目前為止,已經涵蓋了 單元測試、整合測試、效能測試 三個層面,確保程式碼的正確性與效能品質。
▪ 接下來要邁向 CD(Continuous Deployment),第一步就是要讓專案可以被 容器化(Containerization)
▪ 容器化的好處是環境一致,開發環境、測試環境、正式環境都能共用同一套基礎映像檔,減少「我本機沒問題」的窘境。

👉 今天的目標,就是帶大家完成專案的 Docker 映像檔建立


● 目標

  1. 撰寫一份 Dockerfile
  2. 建立對應的 requirements.txt
  3. 使用 Docker 指令將專案打包成映像檔
  4. 啟動容器並檢視 API 成果

● 實作步驟

1. 建立虛擬環境

python -m venv .venv   # 建立虛擬環境
source .venv/bin/activate   # 進入虛擬環境

建立虛擬環境


2. 安裝套件

pip install -r requirements.txt

安裝套件


3. 建立必要檔案

▪ main.py

from fastapi import FastAPI

app = FastAPI(
    openapi_url="/api/v1/openapi.json",
    docs_url="/api/v1/docs",
    redoc_url="/api/v1/redoc",
)

@app.get("/")
def root():
    return {"message": "Hello from Docker!"}

▪ requirements.txt

fastapi
uvicorn[standard]

▪ Dockerfile

# 使用官方 Python 3.12 輕量版基底映像
FROM python:3.12-slim

# 設定容器內的工作目錄為 /app
WORKDIR /app

# 先複製 requirements.txt 進去,方便利用快取分層
COPY requirements.txt .

# 安裝 Python 套件,--no-cache-dir 避免快取佔空間
RUN pip install --no-cache-dir -r requirements.txt

# 再把專案程式碼複製進去(避免每次修改程式都重裝套件)
COPY . .

# 對外開放 8000 port(FastAPI 預設使用)
EXPOSE 8000

# 容器啟動後要執行的指令:用 uvicorn 啟動 FastAPI 應用
CMD ["uvicorn", "main:app", "--host", "0.0.0.0", "--port", "8000"]

▪ .dockerignore

# Python 編譯後快取檔案
__pycache__/
*.pyc
*.pyo
*.pyd

# 虛擬環境(本機使用,不需要打包進容器)
.venv/

# 環境變數檔(通常含敏感資訊,不應放進 image)
.env

# Git 相關檔案(.git 資料夾通常很大,只在版本控制需要,容器內沒必要)
.git

4. 建立映像檔

docker build -t fastapi-app .

建立映像檔


5. 啟動容器

docker run --rm -p 8000:8000 fastapi-app

▪ 啟動容器,退出後自動刪除(--rm:開發及測試階段適用)
啟動容器


6. 開啟 URL 檢視成果

▪ API 根路徑:http://localhost:8000/
API 根路徑

▪ Swagger UI:http://localhost:8000/api/v1/docs
Swagger UI


● 總結

今天我們學會了如何:
▪ 撰寫 Dockerfile
▪ 使用 docker build 建立映像檔
▪ 使用 docker run 啟動容器並測試 API

📌 這是邁向 CD 的第一步,讓專案能夠被「打包」成獨立的環境。


👉 下一篇

Day 10|把映像檔帶到 Kubernetes,學習部署與擴展,讓應用程式真正能跑在雲端叢集上


上一篇
Day 8|效能測試實作與 CI/CD 整合(實務範例 + Locust 報表)
下一篇
Day 10|單體架構到微服務架構 ─ 為Kubernetes打下基礎
系列文
DevOps 進化論:從全能型戰士到安全守門員30
圖片
  熱門推薦
圖片
{{ item.channelVendor }} | {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言