Azure 中的 Python Container Apps 概觀

本文說明如何從 Python 專案程式碼(例如 Web 應用程式)移至 Azure 中已部署的 Docker 容器。 討論的是容器化的一般程式、Azure 中容器的部署選項,以及 Azure 中容器的 Python 特定組態。

Docker 容器的本質是,從程式碼建立 Docker 映射,並將該映射部署到 Azure 中的容器,在程式設計語言中很類似。 在此案例中,特定語言考慮 - Python 是在 Azure 容器化程式中的設定中,特別是支援 Django Flask FastAPI 等 Python Web 架構的 Dockerfile 結構和設定。

容器工作流程案例

針對 Python 容器開發,一些從程式碼移至容器的一般工作流程如下:

案例 描述 工作流程
開發 在開發環境中建置 Python Docker 映射。 程式碼:git 將程式碼複製到開發環境(已安裝 Docker)。

建置:使用 Docker CLI、VS Code(具有擴充功能)、PyCharm(搭配外掛程式)。 如使用 Python Docker 映射和容器 一節 所述。

測試:在 Docker 容器中的開發環境中。

推送:推送至 Azure Container Registry、Docker Hub 或私人登錄等登錄。

部署:從登錄部署至 Azure 服務。
混合式 從您的開發環境,在 Azure 中建置 Python Docker 映射。 程式碼:git 將程式碼複製到開發環境(不需要安裝 Docker)。

組建:VS Code (含擴充功能),Azure CLI。

推送:推送至 Azure Container Registry

部署:從登錄部署至 Azure 服務。
Azure 全部位於雲端中;使用 Azure Cloud Shell 從 GitHub 存放庫建置 Python Docker 映射程式碼。 程式碼:git 將 GitHub 存放庫複製到 Azure Cloud Shell。

建置:在 Azure Cloud Shell 中,使用 Azure CLI 或 Docker CLI。

推送:移至登錄,例如 Azure Container Registry、Docker Hub 或私人登錄。

部署:從登錄部署至 Azure 服務。

這些工作流程的最終目標是讓容器在支援 Docker 容器的其中一個 Azure 資源中執行,如下一節所列。

開發環境可以是具有 Visual Studio Code 或 PyCharm 的本機工作站、 Codespaces (裝載于雲端的開發環境),或 Visual Studio 開發容器 (容器作為開發環境)。

Azure 中的部署容器選項

下列服務支援 Python 容器應用程式。

服務 描述
適用于容器的 Web 應用程式 容器化 Web 應用程式的完全受控裝載服務,包括網站和 Web API。 Azure App 服務上的容器化 Web 應用程式可以視需要進行調整,並搭配 Docker Hub、Azure Container Registry 和 GitHub 使用簡化的 CI/CD 工作流程。 理想的做法是讓開發人員輕鬆利用完全受控Azure App 服務平臺,但也想要包含應用程式及其所有相依性的單一可部署成品。

範例: 在 Azure App 服務 上部署 Flask 或 FastPI Web 應用程式。
Azure Container Apps (ACA) 由 Kubernetes 和開放原始碼技術提供的完整受控無伺服器容器服務,例如 Dapr KEDA envoy 。 根據最佳做法,並針對一般用途容器優化。 叢集基礎結構是由 ACA 管理,不支援直接存取 Kubernetes API。 在容器之上提供許多應用程式特定概念,包括憑證、修訂、規模和環境。 適合想要開始建置容器微服務的小組,而不需要管理 Kubernetes 的基礎複雜性。

範例: 在 Azure Container Apps 上部署 Flask 或 FastPI Web 應用程式
Azure 容器執行個體 (ACI) 無伺服器供應專案,可依需求提供 Hyper-V 隔離容器的單一 Pod。 依耗用量計費,而不是布建的資源。 ACI 容器不提供調整、負載平衡和憑證等概念。 使用者通常會透過其他服務與 ACI 互動;例如,協調流程的 AKS。 如果您需要與 Azure Container Apps 優化案例不一致的「意見」建置組塊,則為理想。

範例: 建立要部署至Azure 容器執行個體的 容器映射。 (本教學課程並非 Python 專屬,但顯示的概念適用于所有語言。
Azure Kubernetes Service (AKS) Azure 中完全受控的 Kubernetes 選項。 支援直接存取 Kubernetes API,並執行任何 Kubernetes 工作負載。 完整叢集位於您的訂用帳戶中,而叢集組態和作業則位於您的控制與責任內。 適用于在 Azure 中尋找完全受控 Kubernetes 版本的小組。

範例: 使用 Azure CLI 部署 Azure Kubernetes Service 叢集。
Azure Functions 事件驅動、無伺服器函式即服務 (FAAS) 解決方案。 與 Azure Container Apps 共用許多特性,以調整和與事件整合,但已針對部署為程式碼或容器的暫時函式優化。 適合想要觸發事件函式執行的小組;例如,若要系結至其他資料來源。

範例: 使用自訂容器在 Linux 上建立函式

如需這些服務的詳細比較,請參閱 比較容器應用程式與其他 Azure 容器選項

虛擬環境和容器

當您在開發環境中執行 Python 專案時,使用虛擬環境是管理相依性並確保專案設定重現性的常見方式。 虛擬環境會安裝 Python 解譯器、程式庫和腳本,而該專案程式碼必須在該環境中執行。 Python 專案的相依性是透過 requirements.txt 檔案來管理。

提示

使用容器時,除非您使用虛擬環境進行測試或其他原因,否則不需要虛擬環境。 如果您使用虛擬環境,請勿將它們複製到 Docker 映射。 使用 .dockerignore 檔案來排除它們。

您可以將 Docker 容器視為提供與虛擬環境類似的功能,但在重現性和可攜性方面具有進一步的優勢。 不論作業系統為何,Docker 容器都可以在容器執行的任何位置執行。

Docker 容器包含您的 Python 專案程式碼,以及程式碼需要執行的所有專案。 若要達到該點,您必須將 Python 專案程式碼建置至 Docker 映射,然後建立容器,這是該映射可執行檔實例。

針對容器化 Python 專案,主要檔案如下:

專案檔 描述
requirements.txt 用於 Docker 映射的建置期間,以取得映射的正確相依性。
Dockerfile 用來指定如何建置 Python Docker 映射。 如需詳細資訊,請參閱適用于 Python 的 Dockerfile 指示一節
.dockerignore .dockerignore 中的 檔案和目錄不會使用 COPY Dockerfile 中的 命令複製到 Docker 映射。 .dockerignore 檔案支援類似 .gitignore 檔案的排除模式。 如需詳細資訊,請參閱 .dockerignore 檔案

排除檔案有助於映射建置效能,但也應該用來避免將敏感性資訊新增至可以檢查的映射。 例如, .dockerignore 應該包含略過 .env .venv (虛擬環境) 的行。

Web 架構的容器設定

Web 架構具有接聽 Web 要求的預設埠。 使用某些 Azure 容器解決方案時,您必須指定容器正在接聽的埠,以接收流量。

Web 架構 Port
Django 8000
5000 或 5002
FastAPI uvicorn 8000 或 80

下表顯示如何設定差異 Azure 容器解決方案的埠。

Azure 容器解決方案 如何設定 Web 應用程式埠
用於容器的 Web App 根據預設,App Service 會假設您的自訂容器正在接聽埠 80 或埠 8080。 如果您的容器接聽不同的埠,請在 App Service 應用程式中設定WEBSITES_PORT應用程式設定。 如需詳細資訊,請參閱 設定Azure App 服務 的自訂容器。
Azure Containers Apps Azure Container Apps 可讓您藉由啟用輸入,將容器應用程式公開至公用 Web、VNET 或環境中的其他容器應用程式。 將輸入 targetPort 設定為容器接聽的連入要求埠。 應用程式輸入端點一律會在埠 443 上公開。 如需詳細資訊,請參閱 在 Azure Container Apps 中設定 HTTPS 或 TCP 輸入。
Azure 容器執行個體、Azure Kubernetes 在建立容器期間設定埠。 您必須確保解決方案具有 Web 架構、應用程式伺服器(例如 gunicorn、uvicorn)和 Web 服務器(例如 nginx)。 例如,您可以建立兩個容器、一個具有 Web 架構和應用程式伺服器的容器,以及另一個具有 Web 服務器的架構。 兩個容器會在一個埠上通訊,而 Web 服務器容器會針對外部要求公開 80/443。

Python Dockerfile

Dockerfile 是文字檔,其中包含建置 Docker 映射的指示。 第一行會指出要開頭的基底映射。 此行後面接著指示來安裝必要的程式、複製檔案和其他指示,以建立工作環境。 例如,一些 Python 特定範例適用于主要 Python Dockerfile 指示,如下表所示。

指示 目的 範例
FROM 設定後續指示的基底映射。 FROM python:3.8-slim
暴露 告知 Docker 容器在執行時間接聽指定的網路埠。 EXPOSE 5000
複製 從指定的來源複製檔案或目錄,並將其新增至位於指定目的地路徑之容器的檔案系統。 COPY . /app
運行 在 Docker 映射內執行命令。 例如,提取相依性。 命令會在建置時執行一次。 RUN python -m pip install -r requirements.txt
Cmd 此命令會提供執行容器的預設值。 只能有一個 CMD 指令。 CMD ["gunicorn", "--bind", "0.0.0.0:5000", "wsgi:app"]

Docker build 命令會從 Dockerfile 和內容建置 Docker 映射。 組建的內容是位於指定路徑或 URL 中的檔案集。 一般而言,您會從 Python 專案的根目錄建置映射,而建置命令的路徑為 「」。如下列範例所示。

docker build --rm --pull  --file "Dockerfile"  --tag "mywebapp:latest"  .

建置程式可以參考內容中的任何檔案。 例如,您的組建可以使用 COPY 指示來參考內容中的檔案。 以下是使用 Flask 架構之 Python 專案的 Dockerfile 範例:

FROM python:3.8-slim

EXPOSE 5000

# Keeps Python from generating .pyc files in the container.
ENV PYTHONDONTWRITEBYTECODE=1

# Turns off buffering for easier container logging
ENV PYTHONUNBUFFERED=1

# Install pip requirements.
COPY requirements.txt .
RUN python -m pip install -r requirements.txt

WORKDIR /app
COPY . /app

# Creates a non-root user with an explicit UID and adds permission to access the /app folder.
RUN adduser -u 5678 --disabled-password --gecos "" appuser && chown -R appuser /app
USER appuser

# Provides defaults for an executing container; can be overridden with Docker CLI.
CMD ["gunicorn", "--bind", "0.0.0.0:5000", "wsgi:app"]

您可以手動建立 Dockerfile,或使用 VS Code 和 Docker 擴充功能自動建立 Dockerfile。 如需詳細資訊,請參閱 產生 Docker 檔案

Docker 組建命令是 Docker CLI 的一部分。 當您使用 VS Code 或 PyCharm 等 IDE 時,使用 Docker 映射的 UI 命令會為您呼叫組建命令,並自動指定選項。

使用 Python Docker 映射和容器

VS Code 和 PyCharm

不需要在適用于 Python 容器開發的整合式開發環境 (IDE) 中工作,但可以簡化許多容器相關工作。 以下是您可以使用 VS Code 和 PyCharm 執行的一些動作。

  • 下載並建置 Docker 映射。

    • 在開發環境中建置映射。
    • 在 Azure 中建置 Docker 映射,而不需在開發環境中安裝 Docker。 (針對 PyCharm,請使用 Azure CLI 在 Azure 中建置映射。
  • 從現有的映射、提取的映射,或直接從 Dockerfile 建立和執行 Docker 容器。

  • 使用 Docker Compose 執行多容器應用程式。

  • 連線並使用 Docker Hub、GitLab、JetBrains Space、Docker V2 和其他自我裝載 Docker 登錄等容器登錄。

  • (僅限 VS Code) 新增專為 Python 專案量身打造的 Dockerfile 和 Docker compose 檔案。

若要設定 VS Code 和 PyCharm 以在開發環境中執行 Docker 容器,請使用下列步驟。

如果您尚未安裝,請安裝 適用于 VS Code 的 Azure 工具。

指示 Screenshot
步驟 1 :使用 SHIFT + ALT + A 開啟 Azure 延伸模組,並確認您已連線到 Azure。

您也可以在 VS Code 擴充功能列上選取 Azure 圖示。

如果您未登入,請選取 [登入 Azure ],然後遵循提示。

如果您無法存取 Azure 訂用帳戶,可能是因為您位於 Proxy 後方。 若要解決連線問題,請參閱 Visual Studio Code 中的網路連線。
Screenshot showing how Azure Tools looks once signed in.Screenshot showing how Azure Tools looks if you aren't signed in.
步驟 2 :使用 CTRL + SHIFT + X 開啟延伸 模組 、搜尋 Docker 擴充功能 ,以及安裝擴充功能。

您也可以選取 VS Code 延伸模組列上的 [ 延伸模組 ] 圖示。
Screenshot showing how to add Docker extension to VS Code.
步驟 3 :選取 擴充列中的 Docker 圖示、展開映射,然後在映射上按一下滑鼠右鍵,以容器身分執行它。 Screenshot showing how to use the Docker extension in VS Code to run a container from a Docker image.
步驟 4 :監視終端 機視窗中的 Docker 執行輸出。 Screenshot showing an example of running a container in VS Code.

Azure CLI 和 Docker CLI

您也可以使用 Azure CLI 和 Docker CLI 來處理 Python Docker 映射和 容器。 VS Code 和 PyCharm 都有終端機,您可以在其中執行這些 CLIS。

當您想要更精細地控制建置和執行引數,以及進行自動化時,請使用 CLI。 例如,下列命令示範如何使用 Azure CLI az acr build 來指定 Docker 映射名稱。

az acr build --registry <registry-name> \
  --resource-group <resource-group> \
  --target pythoncontainerwebapp:latest .

另一個範例是,請考慮下列命令,示範如何使用 Docker CLI 執行 命令。 此範例示範如何執行 Docker 容器,以在容器外部的開發環境中,與 MongoDB 實例通訊。 在命令列中指定時,完成命令的不同值更容易自動化。

docker run --rm -it \
  --publish <port>:<port> --publish 27017:27017 \
  --add-host mongoservice:<your-server-IP-address> \
  --env CONNECTION_STRING=mongodb://mongoservice:27017 \
  --env DB_NAME=<database-name> \
  --env COLLECTION_NAME=<collection-name> \
  containermongo:latest  

如需此案例的詳細資訊,請參閱 在本機 建置及測試容器化的 Python Web 應用程式。

容器中的環境變數

Python 專案通常會使用環境變數將資料傳遞至程式碼。 例如,您可以在環境變數中指定資料庫連接資訊,以便在測試期間輕鬆變更。 或者,將專案部署到生產環境時,可以變更資料庫連接來參考生產資料庫實例。

python-dotenv 之類的 套件通常用來從 .env 檔案讀取機碼/值組,並將其設定為環境變數。 .env 檔案在虛擬環境中執行時很有用,但在使用容器時不建議使用。 請勿將 .env 檔案複製到 Docker 映射,特別是如果它包含敏感性資訊,而且容器將會公開。 使用 .dockerignore 檔案來排除要複製到 Docker 映射中的檔案。 如需詳細資訊,請參閱本文中的虛擬環境和容器 一節

您可以透過幾種方式將環境變數傳遞至容器:

  1. 在 Dockerfile 定義為 ENV 指示。
  2. 使用 Docker 建置 命令以 --build-arg 引數的形式傳入。
  3. --secret使用 Docker 建置命令和 BuildKit 後端以引數的形式傳入。
  4. --env使用 Docker run 命令以 或 --env-file 引數的形式傳入。

前兩個選項的缺點與上述的 .env 檔案相同,也就是您將潛在的敏感性資訊硬式編碼到 Docker 映射中。 您可以檢查 Docker 映射,並查看環境變數,例如,使用 Docker 映射檢查 命令

BuildKit 的第三個選項可讓您傳遞秘密資訊,以安全的方式在 Dockerfile 用來建置 Docker 映射,最終不會儲存在最終映射中。

使用 Docker run 命令傳入環境變數的第四個選項表示 Docker 映射不包含變數。 不過,在檢查容器實例時仍會顯示變數(例如,使用 Docker 容器檢查 )。 當容器實例的存取受到控制,或在測試或開發案例中,可以接受此選項。

以下是使用 Docker CLI 執行命令和使用 引數傳遞環境變數的 --env 範例。

# PORT=8000 for Django and 5000 for Flask
export PORT=<port-number>

docker run --rm -it \
  --publish $PORT:$PORT \
  --env CONNECTION_STRING=<connection-info> \
  --env DB_NAME=<database-name> \
  <dockerimagename:tag>

如果您使用 VS Code 或 PyCharm,使用映射和容器的 UI 選項最終會使用 Docker CLI 命令,例如上面所示的命令。

最後,在 Azure 中部署容器時指定環境變數,與在開發環境中使用環境變數不同。 例如:

  • 針對適用于容器的 Web 應用程式,您可以在 App Service 設定期間設定應用程式設定。 這些設定可供您的應用程式程式碼作為環境變數使用,並使用標準 os.environ 模式進行 存取。 您可以視需要在初始部署之後變更值。 如需詳細資訊,請參閱 以環境變數 身分存取應用程式設定。

  • 針對 Azure Container Apps,您會在容器應用程式的初始設定期間設定環境變數。 環境變數的後續修改會 建立容器的修訂 。 此外,Azure Container Apps 可讓您在應用層級定義秘密,然後在環境變數中參考秘密。 如需詳細資訊,請參閱 管理 Azure Container Apps 中的秘密。

另一個選項是,您可以使用 Service 連線 or 來協助您將 Azure 計算服務連線到其他支援服務。 此服務會設定計算服務和管理平面中目標支援服務之間的網路設定和聯機資訊(例如產生環境變數)。

檢視容器記錄

檢視容器實例記錄,以查看程式代碼輸出的診斷訊息,以及針對容器程式代碼中的問題進行疑難解答。 以下是在開發環境中執行容器時,您可以檢視記錄的幾種方式:

  • 使用 VS Code 或 PyCharm 執行容器,如 VS Code 和 PyCharm 一節所示,您可以在 Docker 執行時開啟的終端機視窗中看到記錄。

  • 如果您使用 Docker CLI 執行 命令搭配互動式旗標 -it,您會在命令之後看到輸出。

  • Docker Desktop 中,您也可以檢視執行中容器的記錄。

當您在 Azure部署容器時,您也可以存取容器記錄。 以下是數個 Azure 服務,以及如何存取 Azure 入口網站 中的容器記錄。

Azure 服務 如何存取 Azure 入口網站 中的記錄
用於容器的 Web App 移至 [ 診斷並解決問題 ] 資源以檢視記錄。 診斷 是一種智慧型手機且互動式的體驗,可協助您對應用程式進行疑難解答,而不需要任何設定。 如需記錄的實時檢視,請移至監視 - 記錄數據流。 如需更詳細的記錄查詢和組態,請參閱監視底下的其他資源。
Azure 容器應用程式 移至環境資源 診斷並解決問題 ,以針對環境問題進行疑難解答。 您通常會想要查看容器記錄。 在容器資源的應用程式修訂管理 - ,選取修訂,然後從該處檢視系統和控制台記錄。 如需更詳細的記錄查詢和組態,請參閱監視底下的資源。
Azure Container Instances 移至 [容器 ] 資源,然後選取 [ 記錄]。

針對上述相同的服務,以下是用來存取記錄的 Azure CLI 命令。

Azure 服務 用來存取記錄的 Azure CLI 命令
用於容器的 Web App az webapp log
Azure 容器應用程式 az containerapps logs
Azure Container Instances az container logs

也支援在 VS Code 中檢視記錄。 您必須安裝適用於 VS Code 的 Azure 工具。 以下是在 VS Code 中檢視 Web Apps for Containers (App Service) 記錄的範例。

Screenshot showing how to view logs in VS Code for Web Apps for Containers.

下一步