前言
除了 Azure 外,還有很多公有雲的服務可以做選擇,譬如AWS/GCP/heroku…等等,甚至可能不採用公有雲服務,自己架設伺服器也是有可能,基於以上這些不同環境,我會建議將服務都包成 docker,讓所開發的應用程式比較不會受到伺服器環境的影響,本篇就來介紹從一個基本的 FastAPI 包成 docker,並發佈的 Azure 服務上
docker 環境安裝
Docker 是一種軟體平台,可讓您快速地建立、測試和部署應用程式。Docker 將軟體封裝到名為容器的標準化單位,其中包含程式庫、系統工具、程式碼和執行時間等執行軟體所需的所有項目。使用 Docker,您可以將應用程式快速地部署到各種環境並加以擴展,而且知道程式碼可以執行 — from AWS 的介紹 https://aws.amazon.com/tw/docker/
關於 docker 環境的安裝,網路上教學應該很多了,此篇文章就不再介紹,如果安裝成功,應該在命令列透過
docker — version
指令可以看到版本
建立一個基本的 FastAPI
本篇再以一個最基本的 API 來做包成 docker 的介紹
requirements.txt
fastAPI
uvicorn
main.py
from typing import Optional
from fastapi import FastAPI
app = FastAPI()
@app.get("/")
def read_root():
return {"Hello": "World"}
@app.get("/items/{item_id}")
def read_item(item_id: int, q: Optional[str] = None):
return {"item_id": item_id, "q": q}
執行以下指令
pip install -r requirement.txt
uvicorn main:app --reload
確認 localhost:8000 能在本機成功跑起站台
Dockerfile
Dockerfile是一個設定檔,用來定義與管理當前這個資料夾所要封裝的應用程式,執行 docker 指令時,就會依造這個檔案所定義的步驟,將應用程式封裝到容器裡面
Dockerfile
# 設定基底的 image,我們指定用python 3.9,執行時會從 dockerhub 這個平台將 python 的 image 拉下來
FROM python:3.9
# 設定容器的工作資料夾
WORKDIR /code
# 複製本地資料夾 requirements.txt這個檔案至容器的 /code/requirements.txt
COPY ./requirements.txt /code/requirements.txt
# 於容器執行 pip 腳本
RUN pip install --no-cache-dir --upgrade -r /code/requirements.txt
# 複製本地資料夾所有檔案(.代表當前目錄)至容器裡的資料夾 /code/app
COPY . /code/app
# 透過uvicorn執行FastAPI伺服器
CMD ["uvicorn", "app.main:app", "--host", "0.0.0.0", "--port", "80"]
包裝 docker image
將下來我們可以將我們的 FastAPI 程式,封裝成 image,名稱為 myfastapi
docker build -t myfastapi .
執行 docker images 應該會看到目前在本機已經有的 images
執行 docker image
有了 image 後,下一步就是透過這個 image,把服務執行起來,這時我們可以用
docker run -d --name myapi -p 80:80 myfastapi
-d: 代表是在背景執行
— name: 這個服務的名稱
-p: 指令內外port <docker內部>:<你的本機對應的port>
myfastapi: image 名稱
執行後,應該會得到一個這個服務的唯一ID,我們可以用 **docker ps **來檢視目前執行中的服務
瀏覽器到 localhost 確認能回傳 Hello World
建立 docker image 的家 — Container Registry
進入 Azure Portal 搜尋 ACR 服務
建立 ACR 服務,我們選 basic 方案即可
發佈 docker image
ACR 服務建立完了,下一步我們要將我們的 myfastapi 發佈到 ACR 上,在這步驟我會建議用 VS Code 是最方便的,如果要用指令的話,可以研究 Azure CLI 這個工具,來跟 ACR 做溝通
VS Code 安裝 — Azure Account
安裝後執行 ctrl (cmd) + p 輸入 sign in 登入 azure 帳號
VS Code 安裝 docker
確認 docker 的擴充功能,可以看到剛剛的包好的 image
點選右鍵 push
選擇剛剛建立的ACR服務後,就會看到命令列正在推送
回到 azure portal 確認有成功推上
將 image 發佈成 Azure Web App Service
建立 Azure Web App ,這次發行方式我們選擇 docker container
選擇 ACR 服務與 Image 名稱
進到 Azure Web App 服務
確認瀏覽器能得到 Hello World
持續交付
程式一定會一直改,也會包成新版本的 image,有沒有可能在有新的 image 時自動發行網站,在Azure可以這樣設定
點選 Deployment Center 並勾選 Continuous deployment
包成 image 我們再依序練習一次 main.py 改成 hello world 2
執行 docker build -t myfastapi . — no-cache ,這次我們多加 — no-cache 指令避免它緩存住
透過 VSCode 再 push 一次
等待幾分鐘後,就能看到是新版的內容了
小結
docker 可說是軟體工程師必備的知識了,一篇文章也無法完整教完整個docker的概念,建議可以用本文提到的關鍵字延伸去學習更多的知識,而本文章是以 Azure 文章為例,當應用程式容器化後,發佈或自建到其他平台也會方便不少,譬如 heroku 可以參考下面的文章,步驟其實大同小異,只是發到不同的 Container Registry / Cloud Platform
站在 Docker 的肩膀上,部署任何語言的 Web 應用到 Heroku | by Larry Lu | Starbugs Weekly 星巴哥技術專欄 | Medium