使用 MongoDB 在本機建置和執行容器化的 Python Web 應用程式
本文內容
本文是如何將容器化和部署容器化 Python Web 應用程式的教學課程的一部分,以 Azure App 服務。 App Service 可讓您執行容器化 Web 應用程式,並透過 Docker Hub、Azure Container Registry 和 Visual Studio Team Services 的持續整合/持續部署 (CI/CD) 功能進行部署。 在本教學課程的這個部分中,您將瞭解如何在本機建置和執行容器化的 Python Web 應用程式。 此步驟是選擇性的,不需要將範例應用程式部署至 Azure。
在您的開發環境中本機執行 Docker 映像需要設定,才能將部署至 Azure。 將其視為可讓未來開發週期更容易的投資,特別是當您超越範例應用程式並開始建立自己的 Web 應用程式時。 若要部署 Django 和 Flask 的範例應用程式,您可以略過此步驟,並移至本教學課程中的下一個步驟。 部署至 Azure 之後,您一律可以傳回 ,並逐步執行這些步驟。
下列服務圖表會醒目提示本文所涵蓋的元件。
1.複製或下載範例應用程式
複製存放庫:
# 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
2.建置 Docker 映射
如果您使用其中一個適用於 Django 和 Flask 的架構範例應用程式,則會設定為 go。 如果您使用自己的範例應用程式,請查看範例應用程式的設定方式,特別是 根目錄中的 Dockerfile 。
此時,您已在本機建置映像。 您建立的映像名稱為 「msdocspythoncontainerwebapp」,並標記 「latest」。 標籤是定義版本資訊、預定用途、穩定性或其他資訊的方法。 如需詳細資訊,請參閱用於標記和版本設定容器映像 的 建議。
從 VS Code 或直接使用 Docker CLI 建置的映射也可以透過 Docker Desktop 應用程式來檢視。
3.設定 MongoDB
在本教學課程中,您需要名為 restaurants_reviews 的 MongoDB 資料庫,以及名為 restaurants_reviews 的 集合。 本節中的步驟說明如何使用 MongoDB 或 Azure Cosmos DB for MongoDB 的本機安裝來建立及存取資料庫和集合。
重要
請勿使用您將在生產環境中使用的 MongoDB 資料庫。 在本教學課程中,您會將 MongoDB 連接字串 儲存在環境變數中。 這讓任何能夠檢查容器的人都能觀察到它(例如,使用 docker inspect
)。
步驟 1: 如果尚未安裝 MongoDB,請加以安裝 。
您可以使用 MongoDB 殼層 (mongosh) 來檢查 MongoDB 的安裝。
下列命令會輸入殼層,併為您提供安裝在系統上的 mongosh 和 mongoDB 伺服器版本:
mongosh
下列命令只會提供安裝在系統上的 MongoDB 伺服器版本:
mongosh --quiet --exec 'db.version()'
如果這些命令無法運作,您可能需要明確安裝 mongosh 或 將 mongosh 連線到 MongoDB 伺服器。
某些安裝中的替代方法是直接叫用 Mongo 精靈。
mongod --version
步驟 2: 編輯 mongod.cfg 檔案以新增電腦的 IP 位址。
mongod 組態檔 有一個bindIp
密鑰,可定義 MongoDB 接聽用戶端連線的主機名和 IP 位址。 新增本機開發計算機的目前IP。 在 Docker 容器中本機執行的應用程式範例會與此地址通訊給主計算機。
例如,組態檔的一部分看起來應該像這樣:
net:
port: 27017
bindIp: 127.0.0.1,<local-ip-address>
重新啟動 MongoDB 以挑選組態檔的變更。
步驟 3: 在本機 MongoDB 資料庫中建立資料庫和集合。
將資料庫名稱設定為 「restaurants_reviews」 並將集合名稱設定為 「restaurants_reviews」。 您可以使用 VS Code MongoDB 擴充功能 、 MongoDB Shell (mongosh) 或任何其他 MondoDB 感知工具來建立資料庫和集合。
針對 MongoDB 殼層,以下是建立資料庫和集合的範例命令:
> help
> use restaurants_reviews
> db.restaurants_reviews.insertOne({})
> show dbs
> exit
此時,您的本機 MongoDB 連接字串 為 「mongodb://127.0.0.1:27017/」,資料庫名稱為 「restaurants_reviews」,而集合名稱為 「restaurants_reviews」。
您可以使用 Azure CLI 命令來建立適用於 MongoDB 的 Azure Cosmos DB 帳戶,然後建立本教學課程所需的資料庫和集合。 如果您之前尚未使用 Azure CLI,請參閱 開始使用 Azure CLI 以瞭解如何在本機下載並安裝 Azure CLI ,或如何在 Azure Cloud Shell 中執行 Azure CLI 命令。
執行下列腳本之前,請以適當的值取代 location 和 Azure Cosmos DB for MongoDB 帳戶名稱。 您可以使用文稿中指定的資源組名,或加以變更。 無論哪種方式,我們建議針對本教學課程中不同文章中建立的所有 Azure 資源使用相同的資源群組。 當您完成本教學課程時,可讓您更輕鬆地刪除它們。 如果您已從第 4 部分 抵達這裡。部署容器 App Service ,使用您已用於資源的資源組名和位置。
腳本假設您使用Bash殼層。 如果您想要使用不同的殼層,您必須變更變數宣告和替代語法。 腳本可能需要幾分鐘的時間才能執行。
#!/bin/bash
# LOCATION: The Azure region. Use the "az account list-locations -o table" command to find a region near you.
# RESOURCE_GROUP_NAME: The resource group name. Can contain underscores, hyphens, periods, parenthesis, letters, and numbers.
# ACCOUNT_NAME: The Azure Cosmos DB for MongDB account name. Can contain lowercase letters, hyphens, and numbers.
LOCATION='eastus'
RESOURCE_GROUP_NAME='msdocs-web-app-rg'
ACCOUNT_NAME='<cosmos-db-account-name>'
# Create a resource group
echo "Creating resource group $RESOURCE_GROUP_NAME in $LOCATION..."
az group create --name $RESOURCE_GROUP_NAME --location $LOCATION
# Create a Cosmos account for MongoDB API
echo "Creating $ACCOUNT_NAME. This command may take a while to complete."
az cosmosdb create --name $ACCOUNT_NAME --resource-group $RESOURCE_GROUP_NAME --kind MongoDB
# Create a MongoDB API database
echo "Creating database restaurants_reviews"
az cosmosdb mongodb database create --account-name $ACCOUNT_NAME --resource-group $RESOURCE_GROUP_NAME --name restaurants_reviews
# Create a MongoDB API collection
echo "Creating collection restaraunts_reviews"
az cosmosdb mongodb collection create --account-name $ACCOUNT_NAME --resource-group $RESOURCE_GROUP_NAME --database-name restaurants_reviews --name restaurants_reviews
# Get the connection string for the MongoDB database
echo "Get the connection string for the MongoDB account"
az cosmosdb keys list --name $ACCOUNT_NAME --resource-group $RESOURCE_GROUP_NAME --type connection-strings
echo "Copy the Primary MongoDB Connection String from the list above"
當腳本完成時,請從最後一個命令的輸出複製主要 MongoDB 連線 ion String 。
{
"connectionStrings": [
{
"connectionString": ""mongodb://msdocs-cosmos-db:pnaMGVtGIRAZHUjsg4GJBCZMBJ0trV4eg2IcZf1TqV...5oONz0WX14Ph0Ha5IeYACDbuVrBPA==@msdocs-cosmos-db.mongo.cosmos.azure.com:10255/?ssl=true&replicaSet=globaldb&retrywrites=false&maxIdleTimeMS=120000&appName=@msdocs-cosmos-db@"",
"description": "Primary MongoDB Connection String",
"keyKind": "Primary",
"type": "MongoDB"
},
...
]
}
此時,您應該會有適用於 MongoDB 的 Azure Cosmos DB 連接字串 格式mongodb://<server-name>:<password>@<server-name>.mongo.cosmos.azure.com:10255/?ssl=true&<other-parameters>
、名為restaurants_reviews
的資料庫,以及名為 的restaurants_reviews
集合。
如需使用 Azure CLI 建立適用於 MongoDB 的 Cosmos DB 帳戶和建立資料庫和集合的詳細資訊,請參閱 使用 Azure CLI 建立適用於 Azure Cosmos DB 的 MongoDB 資料庫和集合。 您也可以使用 PowerShell 、VS Code Azure Databases 擴充功能 ,以及 Azure 入口網站 。
提示
在 VS Code Azure Databases 擴充功能中,您可以以滑鼠右鍵按兩下 MongoDB 伺服器並取得 連接字串。
4.在容器中本機執行映射
透過有關如何連線到 MongoDB 的資訊,您已準備好在本機執行容器。 範例應用程式預期 MongoDB 連線資訊會在環境變數中傳遞。 有數種方式可將環境變數傳遞至本機容器。 每個都有安全性方面的優點和缺點。 您應該避免簽入任何敏感性資訊,或將敏感性資訊留在容器中的程序代碼中。
注意
部署至 Azure 時,Web 應用程式會從設定為 App Service 組態設定的環境值取得連線資訊,而且不會套用本機開發環境案例的修改。
指示
Screenshot
在範例應用程式的 .vscode 資料夾中,settings.json 檔案會定義當您使用 Docker 擴充功能時會發生什麼情況,並從卷標的操作功能表中選取 [執行] 或 [ 執行互動式 ]。 settings.json 檔案會針對 和 (MongoDB Azure)
案例各包含兩個(MongoDB local)
範本。 如果您使用本機 MongoDB 資料庫:
如果您使用適用於 MongoDB 的 Azure Cosmos DB 資料庫:
將的兩個實例<CONNECTION_STRING>
取代為適用於 MongoDB 的 Azure Cosmos DB 連接字串。
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 。
確認容器正在執行。
以滑鼠右鍵按兩下容器名稱,然後選取 [在瀏覽器中 開啟],以測試 Web 應用程式。
瀏覽器會以 “http://127.0.0.1:8000"適用於 Django 或 “http://127.0.0.1:5000/"代表 Flask。
停止容器。
提示
您也可以執行容器,選取執行或偵錯組態。 當您執行或偵錯時,會呼叫 tasks.json 中的 Docker 擴充功能工作。 所呼叫的工作取決於您選取的啟動組態。 針對工作 “Docker: Python (MongoDB local)”,指定 <YOUR-IP-ADDRESS>。 針對工作 “Docker: Python (MongoDB Azure)”,指定 <CONNECTION-STRING>。
步驟 1: 執行最新版的映像。
# PORT=8000 for Django and 5000 for Flask
export PORT=<port-number>
export YOUR_IP_ADDRESS=<your-machine-ip-address>
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 \
msdocspythoncontainerwebapp:latest
上述命令的格式為Bash殼層。 如果您使用 PowerShell、命令提示字元或其他殼層,您可能需要據以調整行接續和環境變數格式。
# 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 \
msdocspythoncontainerwebapp:latest
上述命令的格式為Bash殼層。 如果您使用 PowerShell、命令提示字元或其他殼層,您可能需要據以調整行接續和環境變數格式。
傳入敏感性資訊,如這裡所示,僅供示範之用。 您可以使用 docker 容器檢查命令 來檢視 連接字串 資訊。 處理秘密的另一種方式是使用 Docker 的 BuildKit 功能。
步驟 2。 確認容器正在執行。
開啟第二個殼層並執行 docker 容器 ls 命令。
docker container ls
您應該會在清單中看到容器 「msdocspythoncontainerwebapp:latest:latest」。。 記下 NAMES
輸出和數據 PORTS
行的數據行。 您可以使用名稱來停止容器。
步驟 3。 測試 Web 應用程式。
移至 “http://127.0.0.1:8000"針對 Django 和 “http://127.0.0.1:5000/"當使用本機 MongoDB 執行時,適用於 Flask。
步驟 4. 關閉容器
docker container stop <container-name>
您也可以從映像啟動容器,並使用 Docker Desktop 應用程式加以停止 。
後續步驟