容器中的 Python
在本教學課程中,您將學習如何
先決條件
-
在您的電腦上安裝 Docker 並將其新增至系統路徑。
-
在 Linux 上,您也應該為將用於執行 VS Code 的非根使用者帳戶啟用 Docker CLI。
-
Docker 擴充功能。若要安裝擴充功能,請開啟 [擴充功能] 檢視 (⇧⌘X (Windows、Linux Ctrl+Shift+X)),搜尋
docker
以篩選結果,然後選取 Microsoft 撰寫的 Docker 擴充功能。
建立 Python 專案
如果您還沒有 Python 專案,請依照教學課程Python 入門。
注意:如果您想要容器化完整的 Django 或 Flask Web 應用程式,您可以從下列範例之一開始
注意:在本教學課程中,請務必使用範例存放庫的 tutorial 分支。
在確認您的應用程式正常執行後,您現在可以容器化您的應用程式。
將 Docker 檔案新增至專案
-
在 VS Code 中開啟專案資料夾。
-
開啟命令面板 (⇧⌘P (Windows、Linux Ctrl+Shift+P)),然後選擇Docker:將 Docker 檔案新增至工作區...
-
當系統提示您輸入應用程式類型時,請選取Python:Django、Python:Flask 或 Python:一般作為應用程式類型。在本教學課程中,我們將著重於 Python:一般案例,但也會包含 Django 和 Flask 的注意事項。
-
輸入應用程式進入點的相對路徑。這不包含您開始的工作區資料夾。如果您依照Python 入門教學課程建立具有
hello.py
的 python 應用程式,請選擇該檔案。Django:選擇
manage.py
(根資料夾) 或子資料夾名稱/manage.py
。請參閱官方 Django 文件。Flask:選擇您建立 Flask 執行個體的路徑。請參閱官方 Flask 文件。
提示:您也可以輸入資料夾名稱的路徑,只要此資料夾包含
__main__.py
檔案。 -
選取連接埠號碼。我們建議選取連接埠 1024 或以上,以降低以根使用者身分執行的安全疑慮。任何未使用的連接埠都可以,但 Django 和 Flask 使用標準預設連接埠。
Django:預設連接埠 8000。
Flask:預設連接埠為 5000。
-
當系統提示您包含 Docker Compose 時,如果您不想要 Docker Compose 檔案,請選取否。如果您選取是,您將需要驗證
Dockerfile
中wsgi.py
檔案的路徑,才能成功執行 Compose Up 命令。Compose 通常在一次執行多個容器時使用。 -
有了所有這些資訊,Docker 擴充功能會建立下列檔案
-
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
檔案。 -
(選用) 將環境變數新增至映像
此步驟不是必要步驟,但包含此步驟是為了協助您瞭解如何新增需要在容器環境中設定的環境變數。
Docker 擴充功能可協助您使用 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"
。在子資料夾中,引數會是"子資料夾名稱1.子資料夾名稱2.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:將 Docker 檔案新增至工作區...命令期間,您會設定 Flask 執行個體的路徑,但是,Docker 擴充功能會假設您的 Flask 執行個體變數名為
app
。如果不是這種情況,您必須變更 Dockerfile 中的變數名稱。如果您的主要模組位於根資料夾中,作為名為
main.py
的檔案,且 Flask 執行個體變數名為myapp
,則上述命令中的最後一個引數將會是"main:myapp"
。在子資料夾中,引數會是"子資料夾名稱1.子資料夾名稱2.main:myapp"
。
建置、執行和偵錯容器
Docker:將 Docker 檔案新增至工作區...命令會自動建立 Docker 啟動組態,以在偵錯模式中建置和執行您的容器。若要偵錯您的 Python 應用程式容器
-
導覽至包含應用程式啟動程式碼的檔案,並設定中斷點。
-
導覽至執行與偵錯,然後選取Docker:Python - 一般、Docker:Python - Django 或 Docker:Python - Flask (視情況而定)。
-
使用 F5 鍵開始偵錯。
- Docker 映像會建置。
- Docker 容器會執行。
- python 偵錯工具會在斷點停止。
-
單步執行此行一次。
-
準備就緒時,按一下 [繼續]。
Docker 擴充功能將會啟動您的瀏覽器,並連線到隨機對應的連接埠
提示:若要修改 Docker 建置設定 (例如變更映像標籤),請導覽至
.vscode -> tasks.json
,位於docker-build
工作中的dockerBuild
屬性下。在檔案中使用 IntelliSense (⌃Space (Windows、Linux Ctrl+Space)) 以顯示所有其他有效的指示詞。
使用 Docker 總管
Docker 總管提供互動式體驗,可檢查和管理 Docker 資產,例如容器、映像等等。若要查看範例
-
導覽至 Docker 總管。
-
在 [容器] 索引標籤中,以滑鼠右鍵按一下您的容器,然後選擇檢視記錄。
-
輸出將會顯示在終端機中。
在 Azure 中建置映像
您可以使用命令 Azure Container Registry:在 Azure 中建置映像 來建置映像,然後您可以將該映像部署到 Azure App Service 或 Azure Container Apps。
-
安裝 Azure Resources 擴充功能。開啟命令面板 (⇧⌘P (Windows、Linux Ctrl+Shift+P)),然後搜尋命令 Azure:登入。如果您沒有 Azure 帳戶,您可以註冊免費試用。
-
有兩種方法可以叫用在 Azure 中建置命令。您可以以滑鼠右鍵按一下 Dockerfile,然後選擇在 Azure 中建置映像。您也可以使用命令面板 (⇧⌘P (Windows、Linux Ctrl+Shift+P)),然後搜尋命令 Azure Container Registry:在 Azure 中建置映像。
-
選擇已建置映像的名稱和標籤。您將使用此名稱和標籤在容器登錄中識別它。
-
選擇您想要使用的 Azure 訂用帳戶。
-
選擇現有的 Azure Container Registry,或建立新的登錄。當您建立新的登錄時,系統會要求您提供名稱、資源群組、位置,以及定價選項 (例如基本、標準或進階)。您可以在定價 - Container Registry中閱讀有關這些選項的成本。
-
指定基本作業系統,Linux 或 Windows。此選擇必須與 Dockerfile 一致。
建置映像的程序可能需要幾分鐘。您可以在終端機中追蹤進度。如果您遇到錯誤 (Error: failed to download context.
),請嘗試使用容器登錄上的重新整理選項,然後要求另一個建置。在重新建置之前,請手動刪除舊映像。
部署至 Azure App Service 或 Azure Container Apps
容器映像建置完成後,它應該會與您指定的標籤一起出現在 Container Registry 中。現在已建置,您可以將其部署到 Azure App Service 或 Azure Container Apps。Azure App Service 擴充功能建議用於部署到 Azure App Service,而 Azure Container Apps 擴充功能是部署到 Azure Container Apps 所需的擴充功能。如果您安裝 Azure Tools 擴充功能套件,您可以取得這兩個擴充功能,其中包含適用於各種 Azure 開發案例的工具套件。
-
以滑鼠右鍵按一下映像標籤,然後選擇部署映像到 Azure App Service 或 部署映像到 Azure Container Apps。
-
提供網站的名稱。這必須是唯一的名稱,對於 Django 應用程式,它也必須在
settings.py
檔案中的ALLOWED_HOSTS
清單中列為有效的主機名稱。 -
提供資源群組、位置和 App Service 方案。如果您剛開始使用,您可以選擇免費方案。
-
映像已部署;此程序可能需要幾分鐘。部署完成後,會出現包含按鈕的通知,您可以使用該按鈕來存取網站。您也可以使用網站的位址
{appname}.azurewebsites.net
,其中{appname}
是您在建立時提供的名稱。如果一開始無法運作,請在幾分鐘後重試。前幾次嘗試逾時或傳回錯誤並不罕見。這只是表示 App Service 尚未準備好接收要求。 -
在應用程式程式碼中進行小的變更,該變更在其中一個頁面上可見,然後儲存檔案。
-
使用 Azure 圖示開啟資源檢視,然後展開訂用帳戶的節點,以尋找您在上一個步驟中部署的 App Service。
-
以滑鼠右鍵按一下 App Service 節點,然後查看可用的選項。選擇部署到 Web 應用程式,然後指定您的應用程式資料夾以部署它。
當系統警告這將覆寫先前的部署時,請選擇部署以確認。
這可能需要幾分鐘;您可以在終端機視窗中監視進度。完成時,會提供具有網站存取權的按鈕。
使用按鈕並驗證您的變更是否反映在網站上。
恭喜,您已在 VS Code 中使用 Python 建立並部署託管在雲端且在網際網路上線的網站!
釋出資源
在 Azure 入口網站中,刪除資源群組以釋出您在本練習期間建立的所有資源。
後續步驟
您已完成!現在您的容器已準備就緒,您可能想要