systemd 時:
部署單位
=
Source Code
流程:
Git
↓
Server
↓
pip install
↓
restart
Docker 後:
部署單位
=
Docker Image
流程:
Source Code
↓
Docker Build
↓
Image
↓
Server
↓
Container
這是一個非常重要的轉變。
| 項目 | systemd 直接部署 | Docker 部署 |
|---|---|---|
| Python | Host 安裝 | Image 內 |
| Dependencies | Host virtualenv | Image 內 |
| Application Code | Host File System | Image 內 |
| 啟動方式 | systemd Unit | Docker CMD / ENTRYPOINT |
| Process 管理 | systemd | Docker Runtime |
| 環境一致性 | 靠人工維護 | 由 Image 固定 |
| 版本單位 | Git Commit / Server Code | Image Tag |
| Rollback | 切 Code + 重裝環境 | 換舊 Image |
| 多台 Server | 每台維護環境 | Run 同一 Image |
| 隔離性 | virtualenv 為主 | Container |
| Kubernetes | 不直接適用 | 天然以 Container 為部署基礎 |
如果只有:
一台 Server
一個 FastAPI
流量很小
部署頻率很低
那:
Nginx
+
systemd
+
virtualenv
其實可以非常簡單穩定。
不一定需要:
Docker
Kubernetes
否則反而增加:
學習成本
維運成本
系統複雜度
所以 Docker 的價值會隨著:
環境數量增加
Server 數量增加
服務數量增加
部署頻率增加
CI/CD 自動化需求增加
越來越明顯。
從剛才實作來看,Docker 最重要的改變是:
以前:
我需要把 Server
準備成可以跑 Application 的樣子
現在:
我先把 Application
做成可以直接執行的 Image
所以從:
Configure Server
逐漸轉向:
Build Artifact
Server 的責任開始變小。
它不需要知道:
這個專案用哪個 Python?
FastAPI 是哪一版?
要裝哪些 pip package?
Application 要怎麼啟動?
這些都被放進:
Docker Image
現在只有:
FastAPI Container
非常簡單。
但是實際 Backend 通常還需要:
FastAPI
Redis
MariaDB
如果全部用 Docker:
FastAPI Container
Redis Container
MariaDB Container
我們就開始需要處理:
Container 之間怎麼連?
啟動順序怎麼管理?
環境變數怎麼設定?
Database 資料怎麼保存?
每次要打三個 docker run 嗎?
如果再加入:
Elasticsearch
Worker
Scheduler
手動 docker run 很快就會變得麻煩。
因此下一個實作會開始導入:
Docker Compose。
讓我們用一份設定描述:
FastAPI
+
Redis
+
MariaDB
並實際建立第一個多 Container Backend Environment。