iT邦幫忙

2026 iThome 鐵人賽

DAY 16
0
Kubernetes

探討k8s部署方式系列 第 16 篇

把 FastAPI 做成 Docker Image(續)[Day16]

  • 分享至 

  • xImage
  •  

二十一、Docker 部署時,Server 要準備什麼?

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

二十四、Rollback 差異

假設新版壞掉。

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 的單位變得更加明確。


二十五、Process Restart 差異

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

只是管理單位不同。



上一篇
把 FastAPI 做成 Docker Image(續)[Day15]
下一篇
把 FastAPI 做成 Docker Image(續)[Day17]
系列文
探討k8s部署方式 共 17 篇
圖片
  熱門推薦
圖片
{{ item.channelVendor }} | {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言