共用方式為


Azure 中的 Python Container Apps 概觀

本文說明如何採用 Python 專案,例如 Web 應用程式,並將其部署為 Azure 中的 Docker 容器。 其涵蓋一般容器化工作流程、適用於容器的 Azure 部署選項,以及 Azure 中的 Python 特定容器組態。 在 Azure 中建置和部署 Docker 容器遵循跨語言的一致流程,在 Dockerfile 中設有 Python 特定的配置,以及 requirements.txt和 Web 架構的設定,例如 DjangoFlaskFastAPI

容器工作流程案例

針對 Python 容器開發,下表將討論一些從程式代碼移至容器的一般工作流程。

情境 說明 工作流程
開發 在開發環境中本機建置 Python Docker 映像。 程式代碼:使用 Git 在本機複製應用程式程式代碼(已安裝 Docker)。

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

測試:在本機執行及測試容器。

推送:將映像推送至容器登錄,例如 Azure Container Registry、Docker Hub 或私人登錄。

部署:將容器從登錄部署至 Azure 服務。
混合 在 Azure 中建置 Docker 映像,但從本機環境啟動流程。 程序代碼:在本機複製程序代碼(不需要安裝 Docker)。

組建:若要在 Azure 中觸發組建,請使用 VS Code (搭配遠端擴充功能)或 Azure CLI。

推送:將建置的映像檔推送至 Azure Container Registry。

部署:將容器從登錄部署至 Azure 服務。
天藍色 使用 Azure Cloud Shell 在雲端中完全建置和部署容器。 程式代碼:複製 Azure Cloud Shell 中的 GitHub 存放庫。

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

推送:將映像檔推送到 Azure 容器登錄、Docker Hub 或私人登錄等登錄庫。

部署:將容器從登錄部署至 Azure 服務。

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

開發環境可以是:

Azure 中的部署容器選項

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

服務 說明
適用於容器的 Web 應用程式 Azure App Service 是容器化 Web 應用程式的完全受控裝載平臺,包括網站和 Web API。 它支援可調整的部署,並使用 Docker Hub、Azure Container Registry 和 GitHub 順暢地與 CI/CD 工作流程整合。 這項服務非常適合想要簡單且有效率的路徑來部署容器化應用程式的開發人員,同時受益於 Azure App Service 平臺的完整功能。 藉由將您的應用程式及其所有相依性封裝到單一可部署容器中,您就能夠同時獲得可移植性和輕鬆的管理,而不需要管理基礎結構。

範例: 在 Azure App Service 上部署 Flask 或 FastPI Web 應用程式
Azure Container Apps (ACA) Azure Container Apps (ACA) 是完全受控的無伺服器容器服務,由 Kubernetes 和開放原始碼技術所提供,例如 DaprKEDAenvoy。 其設計結合了業界最佳做法,並已針對執行一般用途容器進行優化。 ACA 會將管理 Kubernetes 基礎結構的複雜度抽象化,不需要或支援直接存取 Kubernetes API。 相反地,它提供較高層級的應用程式建構,例如修訂、調整、憑證和環境,以簡化開發和部署工作流程。 這項服務非常適合開發小組,其建置和部署容器化微服務,其作業額外負荷最少,讓他們專注於應用程序邏輯,而不是基礎結構管理。

範例: 在 Azure Container Apps 上部署 Flask 或 FastPI Web 應用程式
Azure 容器實例 (ACI) Azure 容器實例(ACI)是一種無伺服器方案,可依需求提供 Hyper-V 隔離容器的單一 Pod。 計費是以實際資源耗用量為基礎,而不是預先配置的基礎結構,使其非常適合短期或高載工作負載。 與其他容器服務不同,ACI 不包含內建支援,例如調整、負載平衡或 TLS 憑證等概念。 相反地,它通常會作為基礎容器建置組塊,通常會與 Azure Kubernetes Service (AKS) 等 Azure 服務整合,以進行協調流程。 當不需要 Azure Container Apps 的較高層級抽象概念和功能時,ACI 以輕量選項的形式脫穎而出

範例:建立容器映像檔以部署至 Azure 容器實例。 (本教學課程並非 Python 專屬,但顯示的概念適用於所有語言。
Azure Kubernetes Service (AKS) Azure Kubernetes Service (AKS) 是 Azure 中完全受控的 Kubernetes 選項,可讓您完全掌控 Kubernetes 環境。 它支援直接存取 Kubernetes API,並可執行任何標準的 Kubernetes 工作負載。 完整的叢集位於您的訂用帳戶中,且叢集組態和作業位於您的控制與責任內。 ACI 非常適合尋求完全受控容器解決方案的小組,而 AKS 可讓您完全控制 Kubernetes 叢集,要求您管理設定、網路、調整和作業。 Azure 會處理控制平面和基礎結構布建,但叢集的日常作業和安全性都在小組的控制範圍內。 此服務適用於想要 Kubernetes 彈性和強大功能且具有 Azure 受控基礎結構之額外優點的小組,同時仍保有叢集環境的完整擁有權。

範例: 使用 Azure CLI 部署 Azure Kubernetes Service 叢集
Azure Functions Azure Functions 提供事件驅動、無伺服器函式即服務 (FaaS) 平臺,可讓您在回應事件時執行少量程式碼(函式),而不需要管理基礎結構。 Azure Functions 與 Azure Container Apps 在擴展性及事件觸發的整合上具有許多相似的特性,但它已針對以程式碼或容器形式部署的短期函式進行了優化。 al 適用於想要在事件上觸發函式執行的小組;例如,若要系結至其他數據源。 如同 Azure Container Apps,Azure Functions 支援自動調整和與事件來源整合(例如 HTTP 要求、消息佇列或 Blob 記憶體更新)。 此服務適用於以 Python 或其他語言建置輕量型、事件觸發工作流程的小組,例如處理檔案上傳或回應資料庫變更。

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

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

虛擬環境和容器

Python 中的虛擬環境會隔離專案相依性與系統層級 Python 安裝,確保開發環境之間的一致性。 虛擬環境包含自己的隔離 Python 解釋器,以及執行該環境內特定項目程式代碼所需的連結庫和腳本。 Python 專案的相依性是透過 requirements.txt 檔案來管理。 藉由在 requirements.txt 檔案中指定相依性,開發人員可以重現其專案所需的確切環境。 這種方法有助於更順暢地轉換至容器化部署,例如 Azure App Service,其中環境一致性對於可靠的應用程式效能而言至關重要。

小提示

在容器化的 Python 專案中,虛擬環境通常是不必要的,因為 Docker 容器會提供獨立的環境及其自己的 Python 解釋器和相依性。 不過,您可以使用虛擬環境進行本機開發或測試。 若要讓 Docker 映射保持精簡,請使用 .dockerignore 檔案排除虛擬環境,以防止將不必要的檔案複製到映像。

您可以將 Docker 容器視為提供類似 Python 虛擬環境的功能,但在重現性、隔離和可移植性方面具有更廣泛的優點。 不同於虛擬環境,只要容器運行時間可供使用,Docker 容器就可以在不同的作系統和環境之間一致地執行。

Docker 容器包含您的 Python 專案程式代碼,以及執行所需的一切,例如相依性、環境設定和系統連結庫。 若要建立容器,請先從專案程式代碼和組態建置 Docker 映射,然後啟動容器,這是該映射可執行的實例。

針對容器化 Python 專案,下表說明主要檔案:

項目檔 說明
requirements.txt 此檔案包含應用程式所需的 Python 相依性明確清單。 Docker 會在映像建置程式期間使用此列表來安裝所有必要的套件。 這可確保開發和部署環境之間的一致性。
Dockerfile 此檔案包含建置 Python Docker 映像的指示,包括基底映像選取、相依性安裝、程式代碼複製和容器啟動命令。 它會定義應用程式的完整執行環境。 如需詳細資訊,請參閱 適用於 Python 的 Dockerfile 指示一節。
.dockerignore 此檔案指定在使用 Dockerfile 中的 COPY 命令將內容複製到 Docker 映像時,應排除的檔案和目錄。 此檔案會使用類似 .gitignore 的模式來定義排除。 .dockerignore 檔案支持類似 .gitignore 檔案的排除模式。 如需詳細資訊,請參閱 .dockerignore 檔案

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

Web 架構的容器設定

Web 架構通常會系結至預設埠(例如 Flask 的 5000,適用於 FastAPI 則為 8000)。 當您將容器部署至 Azure 服務時,例如 Azure 容器實例、Azure Kubernetes Service (AKS) 或 App Service for Containers,請務必明確公開和設定容器的接聽埠,以確保正確路由輸入流量。 設定正確的埠可確保 Azure 的基礎結構可以將要求導向至容器內的正確端點。

Web 架構 港口
Django 8000
5000 或 5002
FastAPIuvicorn 8000 或 80

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

Azure 容器解決方案 如何設定 Web 應用程式埠
適用於容器的 Web 應用程式 根據預設,App Service 會假設您的自定義容器正在接聽埠 80 或埠 8080。 如果你的容器使用不同的埠,請在 App Service 應用程式中設定 WEBSITES_PORT 應用程式設定。 如需詳細資訊,請參閱 設定 Azure App Service 的自定義容器
Azure 容器應用程式 Azure Container Apps 可讓您藉由啟用輸入,將容器應用程式公開至公用 Web、虛擬網路,或向相同環境中的其他容器應用程式公開。 將入口 targetPort 設定為容器用來接收請求的連入埠。 應用程式輸入端點一律會在埠 443 上公開。 如需詳細資訊,請參閱 在 Azure Container Apps 中設定 HTTPS 或 TCP 輸入
Azure 容器實例、Azure Kubernetes 您在建立容器或 Pod 時,定義應用程式所使用的監聽埠。 您的容器映像應該包含 Web 架構、應用程式伺服器(例如 gunicorn、uvicorn),以及選擇性的 Web 伺服器(例如 nginx)。 在更複雜的案例中,您可能會將責任分成兩個容器,一個用於應用程式伺服器,另一個用於 Web 伺服器。 在此情況下,Web 伺服器容器通常會公開外部流量的埠 80 或 443。

Python Dockerfile

Dockerfile 是文本檔,其中包含為 Python 應用程式建置 Docker 映像的指示。 第一個指令通常會指定要從中開始的基底映像。 後續指示會詳細說明安裝必要軟體、複製應用程式檔,以及設定環境以建立可執行映像等動作。 下表提供適用於常用 Dockerfile 指示的 Python 特定範例。

指示 目標 範例
設定後續指示的基底映像。 FROM python:3.9-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.9-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

整合式開發環境(IDE),例如 Visual Studio Code (VS Code)和 PyCharm,藉由將 Docker 工作整合到工作流程中,簡化 Python 容器開發。 透過擴充功能或外掛程式,這些 IDE 可簡化建置 Docker 映射、執行容器,以及部署到 App Service 或容器實例等 Azure 服務。 以下是您可以使用 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 工具

操作說明 螢幕截圖
步驟 1:使用 SHIFT + ALT + A 開啟 Azure 延伸模組,並確認您已連線到 Azure。

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

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

如果您無法存取 Azure 訂用帳戶,可能是因為您位於代理伺服器的後面。 若要解決連線問題,請參閱 Visual Studio Code中的網路連線
顯示 Azure 工具登入後外觀的螢幕快照。 螢幕快照,顯示未登入時 Azure 工具的外觀。
步驟 2:使用 CTRL + SHIFT + X 開啟 延伸模組、搜尋 Docker 擴充功能,以及安裝擴充功能。

您也可以選取 VS Code 延伸模組列上的 [ 延伸模組 ] 圖示。
顯示如何將 Docker 擴充功能新增至 VS Code 的螢幕快照。
步驟 3:選取擴充列中的 Docker 圖示、展開映射,然後在 Docker 映射上按兩下滑鼠右鍵,以容器身分執行它。 顯示如何在 VS Code 中使用 Docker 擴充功能從 Docker 映像執行容器的螢幕快照。
步驟 4:監視 終端 機視窗中的 Docker 執行輸出。 顯示 VS Code 中執行容器範例的螢幕快照。

Azure CLI 和 Docker CLI

您也可以使用 Azure CLIDocker 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--env-file 自變數的形式傳入,使用 Docker run 命令。

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

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

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

以下是使用 Docker CLI 執行 run 命令並使用 --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 (Docker 擴充功能) 或 PyCharm (Docker 外掛程式)中,UI 工具可藉由在背景執行標準 Docker CLI 命令(例如 Docker 組建、docker run)來簡化 Docker 映射和容器的管理。

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

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

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

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

檢視容器記錄

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

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

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

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

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

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

針對這些服務,以下是用來存取記錄的 Azure CLI 命令。

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

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

顯示如何在 VS Code for Web Apps for Containers 中檢視記錄的螢幕快照。

後續步驟