Docker 方式下,Server 主要需要:
Docker Runtime
Application 所需的:
Python
FastAPI
Uvicorn
Dependencies
Code
都已經在 Image 裡。
部署比較接近:
取得 Image
│
▼
停止舊 Container
│
▼
啟動新 Container
例如:
docker pull registry.example.com/backend:v2
docker stop backend
docker rm backend
docker run \
-d \
--name backend \
registry.example.com/backend:v2
systemd:
Development
Python 3.12
Staging
Python 3.11
Production
Python 3.12
有可能產生:
Environment Drift
也就是環境逐漸不一致。
Docker:
Development
backend:v1
Staging
backend:v1
Production
backend:v1
使用的是同一個 Image。
所以:
Python
Dependencies
Application
基本上是同一份。
這可以大幅降低:
我的電腦可以跑
Server 不行
這種問題。
systemd 部署通常版本跟 Git 有關。
例如 Server:
git status
git log
才能知道目前是哪一版。
但實務上還可能有人:
直接在 Server 修改 Code
造成:
Git Repository
跟
Production Code
不一致。
Docker 可以使用:
backend:v1.0
backend:v1.1
backend:a1b2c3d
讓執行版本變成:
Image Version
例如 Production 現在:
backend:a1b2c3d
就能明確對應:
Git Commit a1b2c3d
假設新版壞掉。
systemd 可能需要:
git checkout <old-commit>
pip install ...
sudo systemctl restart fastapi
如果新版同時修改:
Python Package
Rollback 又更麻煩。
Docker 如果舊 Image 還存在:
backend:v1
backend:v2
現在 v2 壞掉:
backend:v2 X
可以重新啟動:
backend:v1
因此 Rollback 的單位變得更加明確。
systemd 很擅長:
Process Management
例如:
Restart=always
FastAPI 掛掉:
systemd
→ restart
Docker 本身也可以設定:
docker run \
--restart unless-stopped \
...
例如:
docker run \
-d \
--restart unless-stopped \
--name fastapi-demo \
-p 8000:8000 \
fastapi-deployment-lab:v1
Container Process 掛掉:
Docker
→ restart Container
所以兩者都能處理:
Process Crash
只是管理單位不同。