在本文中,您將瞭解如何在本機計算機上建置和執行容器化的 Django 或 Flask Python Web 應用程式。 若要儲存此應用程式的數據,您可以使用本機 MongoDB 實例或 適用於 MongoDB 的 Azure Cosmos DB。 本文是 5 部分教學課程系列的第 2 部分。 建議您先完成 第 1 部分, 再開始本文。
下列服務圖表會清楚地標示出本文所涵蓋的本機組件。在本文中,您也會學習如何使用適用於 MongoDB 的 Azure Cosmos DB,搭配本機 Docker 映像檔,而不是 MongoDB 的本機實例。
在本節中,您會複製或下載用來建置 Docker 映像的範例 Python 應用程式。 您可以選擇 Django 或 Flask Python Web 應用程式。 如果您有自己的 Python Web 應用程式,您可以選擇改用。 如果您使用自己的 Python Web 應用程式,請確定您的應用程式在根資料夾中有 Dockerfile ,而且可以連線到 MongoDB 資料庫。
使用下列其中一個命令,將 Django 或 Flask 存放庫複製到本機資料夾:
# Django git clone https://github.com/Azure-Samples/msdocs-python-django-container-web-app.git # Flask git clone https://github.com/Azure-Samples/msdocs-python-flask-container-web-app.git
瀏覽至您複製存放庫的根資料夾。
# Django cd msdocs-python-django-container-web-app # Flask cd msdocs-python-flask-container-web-app
在本節中,您會使用 Visual Studio Code 或 Azure CLI 為 Python Web 應用程式建置 Docker 映像。 Docker 映射包含 Python Web 應用程式、其相依性和 Python 運行時間。 Docker 映像是從 Dockerfile 建置,用來定義映像的內容和行為。 Dockerfile 位於您複製或下載的範例應用程式的根資料夾中(或自行提供)。
需要 Visual Studio Code 和 Docker 擴充功能 ,才能使用 Visual Studio Code 在本機建置 Docker 映像。 在繼續之前,請先安裝 Visual Studio Code 和 Docker 擴充功能。 安裝 Visual Studio Code 和 Docker 擴充功能之後,請移至您複製或下載的範例資料夾,並使用 命令 code .
開啟 VS Code。
注意
本節中的步驟需要 Docker 精靈才能執行。 在某些安裝中,例如在 Windows 上,您需要開啟 Docker Desktop 以啟動精靈,再繼續進行。
在 VS Code 中,開啟 Docker 擴充功能,然後選取活動列上的 Docker 擴充功能。
如果 Docker 擴充功能回報「無法連線」錯誤,請確定已安裝並執行 Docker 。
若要建置 Docker 映射,請以滑鼠右鍵按兩下 Dockerfile ,然後選取 [建置映射...]。
如需 Dockerfile 語法的詳細資訊,請參閱 Dockerfile 參考。
若要確認映像已建置,請展開 Docker 延伸模組的 IMAGES 區段,並尋找最近建置的映像。 此容器映像的名稱為 「msdocspythoncontainerwebapp」 (此值設定於 .vscode/tasks.json 檔案中)。
此時,您有一個名為「msdocspythoncontainerwebapp」的本機 Docker 映像檔,其標籤為「latest」。 標籤有助於定義版本詳細數據、預定用途、穩定性和其他相關信息。 如需詳細資訊,請參閱容器映像的標記和版本控制建議。
注意
從 VS Code 或直接使用 Docker CLI 建置的映射也可以透過 Docker Desktop 應用程式來檢視。
您的 Python Web 應用程式需要 名為 restaurants_reviews 的 MongoDB 資料庫,而且需要名為 restaurants_reviews 的集合才能儲存數據。 您可以使用 MongoDB 的本機安裝或 適用於 MongoDB 的 Azure Cosmos DB 來建立及存取資料庫和集合。
重要
請勿使用您在生產環境中使用的 MongoDB 資料庫。 在本教學課程中,您會將 MongoDB 連接字串儲存在環境變數中(可由任何能夠檢查容器的人觀察到,例如使用 docker inspect
)。
安裝 MongoDB (如果尚未安裝)。
您可以使用 MongoDB Shell(mongosh) 來檢查 MongoDB 的安裝。 如果下列命令無法運作,您可能需要明確 安裝 mongosh 或 將 mongosh 連線到 MongoDB 伺服器。
使用下列命令來開啟 MongoDB 殼層,並取得 MongoDB 殼層和 MongoDB 伺服器的版本:
mongosh
提示
若要只傳回安裝在系統上的 MongoDB 伺服器版本,請關閉並重新開啟 MongoDB 殼層,並使用下列命令:
mongosh --quiet --exec 'db.version()'
在某些設定中,您也可以直接在命令提示字元中啟動 Mongo 服務。
mongod --version
編輯資料夾中的
\MongoDB\Server\8.0\bin
mongod.cfg 檔案,並將電腦的本機 IP 位址新增至bindIP
密鑰。bindip
MongoD 組態檔中的金鑰會定義 MongoDB 接聽用戶端連線的主機名和 IP 位址。 新增您本地開發電腦的當前IP。 在 Docker 容器中本機執行的範例 Python Web 應用程式會使用此位址與主計算機通訊。例如,組態檔的一部分看起來應該像這樣:
net: port: 27017 bindIp: 127.0.0.1,<local-ip-address>
將變更儲存至此組態檔。
重要
您需要系統管理許可權,才能儲存您對這個組態檔所做的變更。
重新啟動 MongoDB 以套用設定檔的變更。
開啟 MongoDB 殼層,然後執行下列命令,將資料庫名稱設定為 「restaurants_reviews」,並將集合名稱設定為 「restaurants_reviews」。 您也可以使用 VS Code MongoDB 擴充功能或任何其他 MongoDB 感知工具來建立資料庫和集合。
> help > use restaurants_reviews > db.restaurants_reviews.insertOne({}) > show dbs > exit
完成上一個步驟之後,本機 MongoDB 連接字串為 「mongodb://127.0.0.1:27017/」、資料庫名稱為 「restaurants_reviews」,而集合名稱為 「restaurants_reviews」。。
您現在已準備好在本機執行 Docker 容器。 此範例應用程式預期 MongoDB 連線資訊會透過環境變數傳入它。 有數種方式可將環境變數傳遞至在本地執行的容器。 每個都有安全性方面的優點和缺點。 您應該避免簽入任何敏感性資訊,或將敏感性資訊留在容器中的程序代碼中。
注意
部署至 Azure 時,Web 應用程式會從配置為 App Service 組態設定的環境值中取得連接資訊,本地開發環境案例的任何修改都不適用。
在範例應用程式的 .vscode 資料夾中, settings.json 檔案會定義當您使用 Docker 擴充功能時會發生什麼情況,並從標籤的作功能表中選取 [ 執行 ] 或 [ 執行互動式 ]。 settings.json 檔案包含兩個範本,分別針對
(MongoDB local)
和(MongoDB Azure)
案例。如果您使用本機的 MongoDB 資料庫的話:
將兩個
<YOUR_IP_ADDRESS>
例子替換為您的IP位址。將的兩個實例
<CONNECTION_STRING>
取代為 MongoDB 資料庫的連接字串。將下列環境變數新增至傳遞至 MongoDB 本機範本之 Docker run 命令的變數字串,適用於 “docker.commands.run” 和 “docker.commands.runInteractive” 程式代碼區塊:
-e 'SECRET_KEY=supersecretkeythatispassedtopythonapp'
如果您使用適用於 MongoDB 的 Azure Cosmos DB 資料庫:
將
<CONNECTION_STRING>
的兩個實例取代為適用於 MongoDB 的 Azure Cosmos DB 連接字串。將下列環境變數新增至傳遞給 Docker run 命令的 MongoDB 本機範本之變數串,適用於 "docker.commands.run" 和 "docker.commands.runInteractive" 代碼區塊。
-e 'SECRET_KEY=supersecretkeythatispassedtopythonapp'
設定範本所使用的
docker.dockerPath
組態。 若要設定docker.dockerPath
,請開啟 VS Code 命令選擇區 (Ctrl+Shift+P),輸入 [喜好設定:開啟工作區設定],然後在 [ 搜尋設定 ] 方塊中輸入 “docker.dockerPath”。 針對設定的值輸入 「docker」 (不含引號)。注意
資料庫名稱與集合名稱都假設為
restaurants_reviews
。執行映像。
在 Docker 延伸模組的 IMAGES 區段中,尋找建置的映像。
展開影像以尋找 最新的 標籤,按下滑鼠右鍵,然後選取[ 執行互動式]。
系統會提示您選取適合您案例的工作,例如「互動式執行組態(MongoDB 本機)」或「互動式執行組態(MongoDB Azure)」。
透過互動式執行,您會在程式代碼中看到任何列印語句,這對於偵錯很有用。 您也可以選取 [ 執行],這是非互動式的,而且不會讓標準輸入保持開啟。
重要
如果預設終端機配置檔設定為 [Windows] 命令提示字元,此步驟就會失敗。 若要變更預設配置檔,請開啟 VS Code 命令選擇區 (Ctrl+Shift+P),輸入「終端機:選取預設配置檔」,然後從下拉功能表中選取不同的配置檔,例如 Git Bash 或 PowerShell。
確認 Docker 容器正在執行。
在 Docker 擴充功能的 [容器] 區段中,尋找容器。
展開 [個別容器] 節點,並確認 “msdocspythoncontainerwebapp” 容器正在執行。 尋找容器名稱旁的綠色三角形符號。
以滑鼠右鍵按兩下容器名稱,然後選取 [ 在瀏覽器中開啟],以測試 Web 應用程式。
瀏覽器會以「http://127.0.0.1:8000"」開啟您的預設瀏覽器,適用於 Django,或以「http://127.0.0.1:5000/"」開啟以適用於 Flask。
停止容器。
在 Docker 擴充功能的 [容器] 區段中,尋找執行中的容器。
以滑鼠右鍵按兩下容器,然後選取 [ 停止]。
提示
您也可以執行容器,選取執行或偵錯組態。 當您執行或偵錯時, 會呼叫tasks.json 中的 Docker 擴充功能工作。 所呼叫的工作取決於您選取的啟動組態。 針對任務 "Docker:Python(MongoDB local)",填入你的<IP地址>。 針對工作 “Docker: Python (MongoDB Azure)”,指定 <CONNECTION-STRING>。
您可以使用本地的 MongoDB 實例或適用於 MongoDB 的 Azure Cosmos DB 實例。
執行最新版的映像。
#!/bin/bash # Define variables # Set the port number based on the framework being used: # 8000 for Django, 5000 for Flask export PORT=<port-number> # Replace with actual port (e.g., 8000 or 5000) # Set your computer''s IP address (replace with actual IP) export YOUR_IP_ADDRESS=<your-computer-ip-address> # Replace with actual IP address # Run the Docker container with the required environment variables docker run --rm -it \ --publish "$PORT:$PORT" \ --publish 27017:27017 \ --add-host "mongoservice:$YOUR_IP_ADDRESS" \ --env CONNECTION_STRING=mongodb://mongoservice:27017 \ --env DB_NAME=restaurants_reviews \ --env COLLECTION_NAME=restaurants_reviews \ --env SECRET_KEY="supersecretkeythatispassedtopythonapp" \ msdocspythoncontainerwebapp:latest
# PowerShell syntax # Define variables # Set the port number based on the framework being used: # 8000 for Django, 5000 for Flask $PORT = "your_port_number" # Replace with your actual port number $YOUR_IP_ADDRESS = "your_ip_address" # Replace with your actual IP address # Run the Docker container with the required environment variables docker run --rm -it ` --publish "${PORT}:${PORT}" ` --publish 27017:27017 ` --add-host "mongoservice:$YOUR_IP_ADDRESS" ` --env CONNECTION_STRING="mongodb://mongoservice:27017" ` --env DB_NAME="restaurants_reviews" ` --env COLLECTION_NAME="restaurants_reviews" ` --env SECRET_KEY="supersecretkeythatispassedtopythonapp" ` msdocspythoncontainerwebapp:latest
使用適用於 MongoDB 的 Azure Cosmos DB 實例
#!/bin/bash # PORT=8000 for Django and 5000 for Flask export PORT=<port-number> export CONNECTION_STRING="<connection-string>" docker run --rm -it \ --publish $PORT:$PORT/tcp \ --env CONNECTION_STRING=$CONNECTION_STRING \ --env DB_NAME=restaurants_reviews \ --env COLLECTION_NAME=restaurants_reviews \ --env SECRET_KEY=supersecretkeythatyougenerate \ msdocspythoncontainerwebapp:latest
# PowerShell syntax # PORT=8000 for Django and 5000 for Flask $PORT=<port-number> $ CONNECTION_STRING="<connection-string>" docker run --rm -it ` --publish $PORT:$PORT/tcp ` --env CONNECTION_STRING=$CONNECTION_STRING ` --env DB_NAME=restaurants_reviews ` --env COLLECTION_NAME=restaurants_reviews ` --env SECRET_KEY=supersecretkeythatyougenerate ` msdocspythoncontainerwebapp:latest
僅針對示範目的顯示傳入敏感性資訊。 您可以使用 Docker 容器檢查命令來檢視連接字串資訊。 處理秘密的另一種方式是使用 Docker 的 BuildKit 功能。
確認容器正在執行。 在另一個控制台視窗中,執行 docker container ls 命令。
docker container ls
在清單中查看您的容器 「msdocspythoncontainerwebapp:latest:latest」。。
NAMES
請注意輸出和數據PORTS
行的數據行。 使用容器名稱來停止容器。測試 Web 應用程式。
移至 “http://127.0.0.1:8000"針對 Django 和 “http://127.0.0.1:5000/"代表 Flask。
關閉容器。
docker container stop <container-name>
您也可以從映像啟動容器,並使用 Docker Desktop 應用程式加以停止。