在容器中使用 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 擴充功能可協助您撰寫 Dockerfile,方法是使用 IntelliSense 來提供自動完成和內容相關說明。若要查看此功能的實際運作情況
-
開啟
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
,位於dockerBuild
屬性下的docker-build
工作中。在檔案內使用 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 瞭解這些選項的成本。
-
指定基礎 OS,Linux 或 Windows。此選項必須與 Dockerfile 一致。
建置映像的程序可能需要幾分鐘的時間。您可以在終端機中追蹤進度。如果您遇到錯誤 (Error: failed to download context.
),請嘗試在容器登錄上使用重新整理選項,然後再次要求另一個組建。在重新建置之前,請手動刪除舊映像。
部署至 Azure App Service 或 Azure Container Apps
容器映像建置完成後,它應該會以您指定的標籤出現在容器登錄中。現在已建置完成,您可以將其部署至 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 入口網站中,刪除資源群組以釋放您在本練習期間建立的所有資源。
後續步驟
您已完成!現在您的容器已準備就緒,您可能想要