容器中的 Python
在本教程中,您將學習如何
先決條件
-
在您的計算機上安裝 Docker 並將其新增到系統路徑。
-
在 Linux 上,您還應該為將用於執行 VS Code 的非 root 使用者帳戶啟用 Docker CLI。
-
容器工具擴充套件。要安裝該擴充套件,請開啟“擴充套件”檢視(⇧⌘X (Windows,Linux Ctrl+Shift+X)),搜尋
container tools以篩選結果,然後選擇由 Microsoft 創作的“容器工具”擴充套件。
建立 Python 專案
如果您還沒有 Python 專案,請按照教程 Python 入門進行操作。
注意:如果您想容器化完整的 Django 或 Flask Web 應用,可以從以下示例之一開始
注意:本教程請務必使用示例倉庫的 tutorial 分支。
在驗證您的應用正常執行時,您現在可以容器化您的應用程式。
向專案新增 Docker 檔案
-
在 VS Code 中開啟專案資料夾。
-
開啟命令面板(⇧⌘P (Windows,Linux Ctrl+Shift+P)),然後選擇 Containers: Add Docker Files to Workspace...(容器:將 Docker 檔案新增到工作區...)

-
當提示輸入應用型別時,請選擇 Python: Django、Python: Flask 或 Python: General 作為應用型別。在本教程中,我們將重點關注 Python: General 的情況,但也會包含 Django 和 Flask 的注意事項。
-
輸入應用入口點的相對路徑。這不包括您開始的工作區資料夾。如果您按照 Python 入門教程使用
hello.py建立了一個 Python 應用,請選擇該檔案。Django:選擇
manage.py(根資料夾)或subfolder_name/manage.py。請參閱 Django 官方文件。Flask:選擇您建立 Flask 例項的路徑。請參閱 Flask 官方文件。
提示:您也可以輸入資料夾名稱作為路徑,只要該資料夾包含
__main__.py檔案即可。 -
選擇埠號。我們建議選擇 1024 或更高的埠,以減輕以 root 使用者身份執行帶來的安全問題。任何未使用的埠都可以,但 Django 和 Flask 使用標準的預設埠。
Django:預設埠 8000。
Flask:預設埠為 5000。
-
當提示包含 Docker Compose 時,如果您不想要 Docker Compose 檔案,請選擇 No(否)。如果選擇 Yes(是),您將需要驗證 Dockerfile 中
wsgi.py檔案的路徑才能成功執行 Compose Up 命令。Compose 通常用於一次執行多個容器。 -
有了所有這些資訊,容器工具擴充套件就會建立以下檔案
-
Dockerfile。要了解有關此檔案中 IntelliSense 的更多資訊,請參閱概述。 -
.dockerignore檔案,透過排除不需要的檔案和資料夾(如.git、.vscode和__pycache__)來減小映像大小。 -
如果您使用 Docker Compose,則會生成
docker-compose.yml和docker-compose.debug.yml檔案。 -
如果尚不存在
requirements.txt檔案,則會建立一個用於捕獲所有應用依賴項的檔案。
重要提示:要使用我們的設定,Python 框架(Django/Flask)和 Gunicorn 必須包含在
requirements.txt檔案中。如果虛擬環境/主機已安裝了這些先決條件,並且應與容器環境完全相同,請確保將應用依賴項遷移過來,方法是在終端中執行pip freeze > requirements.txt。這將覆蓋您當前的requirements.txt檔案。 -
(可選)向映像新增環境變數
此步驟不是必需的,但包含它有助於您瞭解如何新增需要在容器環境中設定的環境變數。
容器工具擴充套件透過使用IntelliSense 提供自動補全和上下文幫助,從而幫助您編寫 Dockerfile。要檢視此功能的實際應用
-
開啟
Dockerfile。 -
在
EXPOSE語句下方,鍵入 ⌃Space (Windows,Linux Ctrl+Space) 以觸發 IntelliSense,然後滾動到ENV。
-
按 Tab 或 Enter 完成語句,然後將
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 應用容器
-
導航到包含應用程式啟動程式碼的檔案,並設定一個斷點。
-
導航到執行和除錯,然後選擇 Containers: Python - General(容器:Python - 通用)、Containers: Python - Django 或 Containers: Python - Flask(如適用)。

-
使用 F5 鍵開始除錯。
- 容器映像正在構建。
- 容器正在執行。
- Python 偵錯程式將在斷點處停止。
-
單步執行此行一次。
-
準備就緒後,按繼續。
容器工具擴充套件將啟動您的瀏覽器並連線到一個隨機對映的埠

提示:要修改 Docker 生成設定,例如更改映像標籤,請導航到
.vscode -> tasks.json檔案中的dockerBuild屬性下的docker-build任務。使用檔案內的 IntelliSense(⌃Space (Windows,Linux Ctrl+Space))來顯示所有其他有效指令。
使用容器資源管理器
容器資源管理器提供了一個互動式體驗,用於檢查和管理容器資產,如容器、映像等。要檢視示例
-
導航到容器資源管理器。
-
在容器選項卡中,右鍵單擊您的容器,然後選擇檢視日誌。

-
輸出將顯示在終端中。
在 Azure 中構建映像
您可以使用命令 Azure Container Registry: Build Image in Azure(Azure 容器登錄檔:在 Azure 中構建映像)來構建一個映像,然後將其部署到 Azure 應用服務或 Azure 容器應用。
-
安裝 Azure 資源擴充套件。開啟命令面板(⇧⌘P (Windows,Linux Ctrl+Shift+P))並搜尋命令 Azure: Sign In(Azure:登入)。如果您沒有 Azure 帳戶,可以註冊一個免費試用。
-
有兩種方法可以呼叫 Azure 中的生成命令。您可以右鍵單擊 Dockerfile,然後選擇在 Azure 中構建映像。您也可以使用命令面板(⇧⌘P (Windows,Linux Ctrl+Shift+P))並搜尋命令 Azure Container Registry: Build Image in Azure(Azure 容器登錄檔:在 Azure 中構建映像)。

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

-
選擇要使用的 Azure 訂閱。
-
選擇一個現有的 Azure 容器登錄檔,或建立一個新的。當您建立一個新的登錄檔時,系統會要求您提供名稱、資源組、位置以及定價選項(如 Basic、Standard 或 Premium)。您可以在定價 - 容器登錄檔處瞭解這些選項的成本。
-
指定基礎作業系統(Linux 或 Windows)。此選擇必須與 Dockerfile 一致。

構建映像的過程可能需要幾分鐘。您可以在終端中跟蹤進度。如果您遇到錯誤(Error: failed to download context.),請嘗試使用容器登錄檔上的重新整理選項,然後請求重新生成。在重新生成之前,請手動刪除舊映像。
部署到 Azure 應用服務或 Azure 容器應用
一旦容器映像構建完成,它應該會出現在容器登錄檔中,並帶有您指定的標籤。現在它已構建完成,您可以將其部署到 Azure 應用服務或 Azure 容器應用。建議使用 Azure 應用服務擴充套件進行部署到 Azure 應用服務,部署到 Azure 容器應用則需要 Azure 容器應用擴充套件。透過安裝 Azure 工具擴充套件包,您可以獲得這兩者,該包包含一套用於各種 Azure 開發場景的工具。
-
右鍵單擊映像標籤,然後選擇將映像部署到 Azure 應用服務或將映像部署到 Azure 容器應用。

-
提供網站名稱。此名稱必須是唯一的,對於 Django 應用,還必須在
settings.py檔案中的ALLOWED_HOSTS列表中列為有效主機名。 -
提供資源組、位置和應用服務計劃。如果您剛開始,可以選擇免費計劃。
-
映像已部署;過程可能需要幾分鐘。部署完成後,將顯示一個通知,其中包含一個可用於訪問網站的按鈕。您還可以使用網站地址
{appname}.azurewebsites.net,其中{appname}是您建立時提供的名稱。如果第一次不工作,請在幾分鐘後重試。首次嘗試超時或返回錯誤並不罕見。這僅僅意味著應用服務尚未準備好接收請求。 -
在應用程式程式碼中進行一個小改動,使其在一個頁面上可見,然後儲存檔案。
-
使用 Azure 圖示開啟資源檢視,然後展開您訂閱的節點以找到您在上一步中部署的應用服務。
-
右鍵單擊應用服務節點,然後檢視可用選項。選擇部署到 Web 應用,然後指定您的應用資料夾進行部署。

當警告此操作將覆蓋先前的部署時,請選擇部署進行確認。
這可能需要幾分鐘;您可以在終端視窗中監視進度。完成後,將提供一個帶有訪問網站的按鈕。

使用按鈕並驗證您的更改是否已反映在網站上。
恭喜您!您已在 VS Code 中使用 Python 建立並部署了一個託管在雲中、即時執行的網站!
釋放資源
在 Azure 門戶中,刪除資源組以釋放您在此練習中建立的所有資源。
後續步驟
你已完成!現在你的容器已準備就緒,你可能想