現已釋出!閱讀關於 11 月新增功能和修復的內容。

容器中的 Python

在本教程中,您將學習如何

  • 建立一個描述簡單 Python 容器的 Dockerfile 檔案。
  • 構建、執行並驗證 DjangoFlask 或通用 Python 應用的功能。
  • 除錯在容器中執行的應用程式。

先決條件

建立 Python 專案

如果您還沒有 Python 專案,請按照教程 Python 入門進行操作。

注意:如果您想容器化完整的 Django 或 Flask Web 應用,可以從以下示例之一開始

注意:本教程請務必使用示例倉庫的 tutorial 分支。

在驗證您的應用正常執行時,您現在可以容器化您的應用程式。

向專案新增 Docker 檔案

  1. 在 VS Code 中開啟專案資料夾。

  2. 開啟命令面板⇧⌘P (Windows,Linux Ctrl+Shift+P)),然後選擇 Containers: Add Docker Files to Workspace...(容器:將 Docker 檔案新增到工作區...)

    Add Dockerfile to a Python project

  3. 當提示輸入應用型別時,請選擇 Python: DjangoPython: FlaskPython: General 作為應用型別。在本教程中,我們將重點關注 Python: General 的情況,但也會包含 Django 和 Flask 的注意事項。

  4. 輸入應用入口點的相對路徑。這不包括您開始的工作區資料夾。如果您按照 Python 入門教程使用 hello.py 建立了一個 Python 應用,請選擇該檔案。

    Django:選擇 manage.py(根資料夾)或 subfolder_name/manage.py。請參閱 Django 官方文件

    Flask:選擇您建立 Flask 例項的路徑。請參閱 Flask 官方文件

    提示:您也可以輸入資料夾名稱作為路徑,只要該資料夾包含 __main__.py 檔案即可。

  5. 選擇埠號。我們建議選擇 1024 或更高的埠,以減輕以 root 使用者身份執行帶來的安全問題。任何未使用的埠都可以,但 Django 和 Flask 使用標準的預設埠。

    Django:預設埠 8000。

    Flask:預設埠為 5000。

  6. 當提示包含 Docker Compose 時,如果您不想要 Docker Compose 檔案,請選擇 No(否)。如果選擇 Yes(是),您將需要驗證 Dockerfile 中 wsgi.py 檔案的路徑才能成功執行 Compose Up 命令。Compose 通常用於一次執行多個容器。

  7. 有了所有這些資訊,容器工具擴充套件就會建立以下檔案

    • Dockerfile。要了解有關此檔案中 IntelliSense 的更多資訊,請參閱概述

    • .dockerignore 檔案,透過排除不需要的檔案和資料夾(如 .git.vscode__pycache__)來減小映像大小。

    • 如果您使用 Docker Compose,則會生成 docker-compose.ymldocker-compose.debug.yml 檔案。

    • 如果尚不存在 requirements.txt 檔案,則會建立一個用於捕獲所有應用依賴項的檔案。

    重要提示:要使用我們的設定,Python 框架(Django/Flask)和 Gunicorn 必須包含requirements.txt 檔案中。如果虛擬環境/主機已安裝了這些先決條件,並且應與容器環境完全相同,請確保將應用依賴項遷移過來,方法是在終端中執行 pip freeze > requirements.txt這將覆蓋您當前的 requirements.txt 檔案。

(可選)向映像新增環境變數

此步驟不是必需的,但包含它有助於您瞭解如何新增需要在容器環境中設定的環境變數。

容器工具擴充套件透過使用IntelliSense 提供自動補全和上下文幫助,從而幫助您編寫 Dockerfile。要檢視此功能的實際應用

  1. 開啟 Dockerfile

  2. EXPOSE 語句下方,鍵入 ⌃Space (Windows,Linux Ctrl+Space) 以觸發 IntelliSense,然後滾動到 ENV

    Adding environment variable to Dockerfile

  3. TabEnter 完成語句,然後將 key 設定為變數名,將 value 設定為值。

有關在 Dockerfile 中設定和使用環境變數的更多資訊,請參閱 Docker 文件中的 ENV 指令和環境變數替換部分。

Gunicorn 對 Django 和 Flask 應用的修改

為了給 Python Web 開發人員提供一個很好的起點,我們選擇使用 Gunicorn 作為預設 Web 伺服器。由於它在預設 Dockerfile 中被引用,因此它被包含在 requirements.txt 檔案中作為依賴項。如果未在 requirements.txt 中看到它,請執行 pip install gunicorn,然後執行 pip freeze > requirements.txt 來重新生成 requirements.txt 檔案。

  • Django:要使用 Gunicorn,它必須繫結到一個應用程式可呼叫項(應用程式伺服器用來與您的程式碼通訊的內容)作為入口點。此可呼叫項在 Django 應用程式的 wsgi.py 檔案中宣告。要完成此繫結,Dockerfile 中的最後一行是

    CMD ["gunicorn", "--bind", "0.0.0.0:8000", "{workspace_folder_name}.wsgi"]
    

    如果您的專案不遵循 Django 的預設專案結構(即,一個工作區資料夾和一個位於與工作區同名的子資料夾中的 wsgi.py 檔案),您必須覆蓋 Dockerfile 中的 Gunicorn 入口點,以找到正確的 wsgi.py 檔案。

    如果您的 wsgi.py 檔案在根資料夾中,命令中的最後一個引數將是 "wsgi"。在子資料夾中,引數將是 "subfolder1_name.subfolder2_name.wsgi"

  • Flask:要使用 Gunicorn,它必須繫結到一個應用程式可呼叫項(應用程式伺服器用來與您的程式碼通訊的內容)作為入口點。此可呼叫項對應於您建立的 Flask 例項的檔案位置變數名。根據 Flask 官方文件,使用者通常在主模組或包的 __init__.py 檔案中以這種方式建立 Flask 例項

    from flask import Flask
    app = Flask(__name__) # Flask instance named app
    

    要完成此繫結,Dockerfile 中的最後一行是

    CMD ["gunicorn", "--bind", "0.0.0.0:5000", "{subfolder}.{module_file}:app"]
    

    Containers: Add Docker Files to Workspace...(容器:將 Docker 檔案新增到工作區...)命令期間,您可以配置 Flask 例項的路徑,但是,容器工具擴充套件假定您的 Flask 例項變數名為 app。如果不是這種情況,您必須在 Dockerfile 中更改變數名。

    如果您的主模組在根資料夾中,名為 main.py,並且 Flask 例項變數名為 myapp,則命令中的最後一個引數將是 "main:myapp"。在子資料夾中,引數將是 "subfolder1_name.subfolder2_name.main:myapp"

構建、執行和除錯容器

Containers: Add Docker Files to Workspace...(容器:將 Docker 檔案新增到工作區...)命令會自動建立一個 Docker 啟動配置,用於在除錯模式下構建和執行您的容器。要除錯您的 Python 應用容器

  1. 導航到包含應用程式啟動程式碼的檔案,並設定一個斷點。

  2. 導航到執行和除錯,然後選擇 Containers: Python - General(容器:Python - 通用)、Containers: Python - DjangoContainers: Python - Flask(如適用)。

    Selected container debug configuration

  3. 使用 F5 鍵開始除錯。

    • 容器映像正在構建。
    • 容器正在執行。
    • Python 偵錯程式將在斷點處停止。
  4. 單步執行此行一次。

  5. 準備就緒後,按繼續。

容器工具擴充套件將啟動您的瀏覽器並連線到一個隨機對映的埠

Django website launches

提示:要修改 Docker 生成設定,例如更改映像標籤,請導航到 .vscode -> tasks.json 檔案中的 dockerBuild 屬性下的 docker-build 任務。使用檔案內的 IntelliSense(⌃Space (Windows,Linux Ctrl+Space))來顯示所有其他有效指令。

使用容器資源管理器

容器資源管理器提供了一個互動式體驗,用於檢查和管理容器資產,如容器、映像等。要檢視示例

  1. 導航到容器資源管理器。

  2. 容器選項卡中,右鍵單擊您的容器,然後選擇檢視日誌

    Viewing the logs of a container

  3. 輸出將顯示在終端中。

在 Azure 中構建映像

您可以使用命令 Azure Container Registry: Build Image in Azure(Azure 容器登錄檔:在 Azure 中構建映像)來構建一個映像,然後將其部署到 Azure 應用服務或 Azure 容器應用。

  1. 安裝 Azure 資源擴充套件。開啟命令面板⇧⌘P (Windows,Linux Ctrl+Shift+P))並搜尋命令 Azure: Sign In(Azure:登入)。如果您沒有 Azure 帳戶,可以註冊一個免費試用

  2. 有兩種方法可以呼叫 Azure 中的生成命令。您可以右鍵單擊 Dockerfile,然後選擇在 Azure 中構建映像。您也可以使用命令面板⇧⌘P (Windows,Linux Ctrl+Shift+P))並搜尋命令 Azure Container Registry: Build Image in Azure(Azure 容器登錄檔:在 Azure 中構建映像)。

    Invoke the command Build Image in Azure

  3. 選擇要構建的映像的名稱和標籤。您將在容器登錄檔中標識它。

    Choose the name and tag for the built image.

  4. 選擇要使用的 Azure 訂閱。

  5. 選擇一個現有的 Azure 容器登錄檔,或建立一個新的。當您建立一個新的登錄檔時,系統會要求您提供名稱、資源組、位置以及定價選項(如 Basic、Standard 或 Premium)。您可以在定價 - 容器登錄檔處瞭解這些選項的成本。

  6. 指定基礎作業系統(Linux 或 Windows)。此選擇必須與 Dockerfile 一致。

    Choose the base OS for the built image

構建映像的過程可能需要幾分鐘。您可以在終端中跟蹤進度。如果您遇到錯誤(Error: failed to download context.),請嘗試使用容器登錄檔上的重新整理選項,然後請求重新生成。在重新生成之前,請手動刪除舊映像。

部署到 Azure 應用服務或 Azure 容器應用

一旦容器映像構建完成,它應該會出現在容器登錄檔中,並帶有您指定的標籤。現在它已構建完成,您可以將其部署到 Azure 應用服務或 Azure 容器應用。建議使用 Azure 應用服務擴充套件進行部署到 Azure 應用服務,部署到 Azure 容器應用則需要 Azure 容器應用擴充套件。透過安裝 Azure 工具擴充套件包,您可以獲得這兩者,該包包含一套用於各種 Azure 開發場景的工具。

  1. 右鍵單擊映像標籤,然後選擇將映像部署到 Azure 應用服務將映像部署到 Azure 容器應用

    Deploy image to Azure App Service

  2. 提供網站名稱。此名稱必須是唯一的,對於 Django 應用,還必須在 settings.py 檔案中的 ALLOWED_HOSTS 列表中列為有效主機名。

  3. 提供資源組、位置和應用服務計劃。如果您剛開始,可以選擇免費計劃。

  4. 映像已部署;過程可能需要幾分鐘。部署完成後,將顯示一個通知,其中包含一個可用於訪問網站的按鈕。您還可以使用網站地址 {appname}.azurewebsites.net,其中 {appname} 是您建立時提供的名稱。如果第一次不工作,請在幾分鐘後重試。首次嘗試超時或返回錯誤並不罕見。這僅僅意味著應用服務尚未準備好接收請求。

  5. 在應用程式程式碼中進行一個小改動,使其在一個頁面上可見,然後儲存檔案。

  6. 使用 Azure 圖示開啟資源檢視,然後展開您訂閱的節點以找到您在上一步中部署的應用服務。

  7. 右鍵單擊應用服務節點,然後檢視可用選項。選擇部署到 Web 應用,然後指定您的應用資料夾進行部署。

    Deploy to Web App

    當警告此操作將覆蓋先前的部署時,請選擇部署進行確認。

    這可能需要幾分鐘;您可以在終端視窗中監視進度。完成後,將提供一個帶有訪問網站的按鈕。

    Browse website button

    使用按鈕並驗證您的更改是否已反映在網站上。

恭喜您!您已在 VS Code 中使用 Python 建立並部署了一個託管在雲中、即時執行的網站!

釋放資源

Azure 門戶中,刪除資源組以釋放您在此練習中建立的所有資源。

後續步驟

你已完成!現在你的容器已準備就緒,你可能想

© . This site is unofficial and not affiliated with Microsoft.