容器中的 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))並選擇容器:向工作區新增 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 檔案,請選擇否。如果您選擇是,您需要驗證
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 指令 和 環境替換 部分。
Django 和 Flask 應用程式的 Gunicorn 修改
為了給 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"]
在執行容器:向工作區新增 Docker 檔案... 命令期間,您配置了 Flask 例項的路徑,但是,容器工具擴充套件假定您的 Flask 例項變數名為
app
。如果不是這種情況,您必須更改 Dockerfile 中的變數名。如果您的主模組位於根資料夾中,檔名為
main.py
,並且 Flask 例項變數名為myapp
,則上述命令的最後一個引數將是"main:myapp"
。在子資料夾中,引數將是"subfolder1_name.subfolder2_name.main:myapp"
。
構建、執行和除錯容器
容器:向工作區新增 Docker 檔案... 命令會自動建立一個 Docker 啟動配置,以除錯模式構建和執行您的容器。要除錯您的 Python 應用程式容器:
-
導航到包含應用程式啟動程式碼的檔案,並設定一個斷點。
-
導航到執行和除錯並選擇容器:Python - 通用、容器:Python - Django 或容器:Python - Flask,視情況而定。
-
使用 F5 鍵開始除錯。
- 容器映象正在構建。
- 容器正在執行。
- Python 偵錯程式在斷點處停止。
-
單步執行此行一次。
-
準備就緒後,按繼續。
容器工具擴充套件將您的瀏覽器啟動到一個隨機對映的埠
提示:要修改您的 Docker 構建設定,例如更改映象標籤,請在
docker-build
任務的dockerBuild
屬性下導航到.vscode -> tasks.json
。在檔案中使用 IntelliSense(⌃Space (Windows, Linux Ctrl+Space))以顯示所有其他有效指令。
使用容器瀏覽器
容器瀏覽器提供互動式體驗來檢查和管理容器資產,例如容器、映象等。要檢視示例:
-
導航到容器瀏覽器。
-
在容器選項卡中,右鍵單擊您的容器並選擇檢視日誌。
-
輸出將顯示在終端中。
在 Azure 中構建映象
您可以使用命令Azure 容器登錄檔:在 Azure 中構建映象來構建一個映象,然後您可以將其部署到 Azure 應用服務或 Azure 容器應用。
-
安裝 Azure 資源擴充套件。開啟命令面板(⇧⌘P (Windows, Linux Ctrl+Shift+P))並搜尋命令Azure:登入。如果您沒有 Azure 帳戶,您可以註冊免費試用版。
-
有兩種方法可以呼叫 Azure 中的構建命令。您可以右鍵單擊 Dockerfile,然後選擇在 Azure 中構建映象。您還可以使用命令面板(⇧⌘P (Windows, Linux Ctrl+Shift+P))並搜尋命令Azure 容器登錄檔:在 Azure 中構建映象。
-
為構建的映象選擇名稱和標籤。您將使用它在容器登錄檔中識別它。
-
選擇您要使用的 Azure 訂閱。
-
選擇一個現有的 Azure 容器登錄檔,或建立一個新的。當您建立一個新的登錄檔時,系統會要求您提供名稱、資源組、位置和定價選項,例如基本、標準或高階。您可以在定價 - 容器登錄檔中瞭解這些選項的成本。
-
指定基礎作業系統,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
列表中列為有效的 hostname。 -
提供資源組、位置和應用服務計劃。如果您剛開始,可以選擇免費計劃。
-
映象正在部署;該過程可能需要幾分鐘。部署完成後,會出現一個通知,其中包含一個按鈕,您可以使用它訪問該站點。您還可以使用站點的地址
{appname}.azurewebsites.net
,其中{appname}
是您建立時給定的名稱。如果一開始不起作用,請在幾分鐘後重試。前幾次嘗試超時或返回錯誤並不少見。這只是意味著應用服務尚未準備好接收請求。 -
對應用程式程式碼進行一個小更改,使其在其中一個頁面上可見,然後儲存檔案。
-
使用 Azure 圖示開啟資源檢視,並展開您的訂閱節點以找到您在上一步中部署的應用服務。
-
右鍵單擊應用服務節點並檢視可用選項。選擇部署到 Web 應用,然後指定您的應用程式資料夾以進行部署。
當警告此操作將覆蓋以前的部署時,選擇部署以確認。
這可能需要幾分鐘;您可以在終端視窗中監控進度。完成後,將提供一個訪問該站點的按鈕。
使用該按鈕並驗證您的更改是否反映在站點上。
恭喜,您已在 VS Code 中使用 Python 建立並部署了一個託管在雲端並在網際網路上執行的網站!
釋放資源
在Azure 門戶中,刪除資源組以釋放您在此練習期間建立的所有資源。
後續步驟
你已完成!現在你的容器已準備就緒,你可能想