共用方式為


在本機建置並執行容器化的 Python Web 應用程式

在本教學課程系列的這個部分中,您將瞭解如何在本機計算機上建置和執行容器化 DjangoFlask Python Web 應用程式。 若要儲存此應用程式的數據,您可以使用本機 MongoDB 實例或 適用於 MongoDB 的 Azure Cosmos DB。 本文是 5 部分教學課程系列的第 2 部分。 建議您先完成 第 1 部分, 再開始本文。

下列服務圖表會清楚地標示出本文所涵蓋的本機組件。在本文中,您也會學習如何使用適用於 MongoDB 的 Azure Cosmos DB,搭配本機 Docker 映像檔,而不是 MongoDB 的本機實例。

教學課程 - 在 Azure 上容器化 Python 應用程式螢幕快照,其中已醒目提示本地部分。

複製或下載範例 Python 應用程式

在本節中,您會複製或下載用來建置 Docker 映像的範例 Python 應用程式。 您可以選擇 Django 或 Flask Python Web 應用程式。 如果您有自己的 Python Web 應用程式,您可以選擇改用。 如果您使用自己的 Python Web 應用程式,請確定您的應用程式在根資料夾中有 Dockerfile ,而且可以連線到 MongoDB 資料庫。

  1. 使用下列其中一個命令,將 Django 或 Flask 存放庫複製到本機資料夾:

    # Django
    git clone https://github.com/Azure-Samples/msdocs-python-django-container-web-app.git
    
  2. 瀏覽至您複製存放庫的根資料夾。

    # Django
    cd msdocs-python-django-container-web-app
    

建置 Docker 映像

在本節中,您會使用 Visual Studio Code 或 Azure CLI 為 Python Web 應用程式建置 Docker 映像。 Docker 映射包含 Python Web 應用程式、其相依性和 Python 運行時間。 Docker 映像是從 Dockerfile 建置,用來定義映像的內容和行為。 Dockerfile 位於您複製或下載的範例應用程式的根資料夾中(或自行提供)。

小提示

如果您不熟悉 Azure CLI,請參閱 開始使用 Azure CLI 以瞭解如何在本機下載並安裝 Azure CLI,或如何在 Azure Cloud Shell 中執行 Azure CLI 命令。

需要 Docker 才能使用 Docker CLI 建置 Docker 映射。 安裝 Docker 之後,開啟終端機視窗並流覽至範例資料夾。

備註

本節中的步驟需要 Docker 精靈才能執行。 在某些安裝中,例如在 Windows 上,您需要開啟 Docker Desktop,以啟動精靈,再繼續進行。

  1. 在範例應用程式的根資料夾中執行下列命令,確認 Docker 可供存取。

    docker
    

    如果在執行此命令之後,您會看到 Docker CLI 的說明,Docker 是可存取的。 否則,請確保已安裝 Docker 並且您的 shell 可以存取 Docker CLI。

  2. 使用 Docker build 命令建置 Python Web 應用程式的 Docker 映像。

    命令的一般形式為 docker build --rm --pull --file "<path-to-project-root>/Dockerfile" --label "com.microsoft.created-by=docker-cli" --tag "<container-name>:latest" "<path-to-project-root>"

    如果您位於專案的根資料夾,請使用下列命令來建置 Docker 映像。 命令結尾的點 (“.”) 是指命令執行所在的目前目錄。 若要強制重建,請新增 --no-cache

    #!/bin/bash
    docker build --rm --pull \
      --file "Dockerfile" \
      --label "com.microsoft.create-by=docker-cli" \
      --tag "msdocspythoncontainerwebapp:latest" \
        .
    
  3. 使用 Docker images 命令確認映像已順利建置。

    docker images
    

    此命令會依據倉庫名稱、標籤和建立日期傳回映像清單,以及其他映像特性。

此時,您有一個名為「msdocspythoncontainerwebapp」的本機 Docker 映像檔,其標籤為「latest」。 標籤有助於定義版本詳細數據、預定用途、穩定性和其他相關信息。 如需詳細資訊,請參閱容器映像的標記和版本控制建議

備註

從 VS Code 或直接使用 Docker CLI 建置的映射也可以透過 Docker Desktop 應用程式來檢視。

設定 MongoDB

您的 Python Web 應用程式需要 名為 restaurants_reviews 的 MongoDB 資料庫,而且需要名為 restaurants_reviews 的集合才能儲存數據。 在本教學課程中,您會使用 MongoDB 的本機安裝和 適用於 MongoDB 的 Azure Cosmos DB 實例來建立和存取資料庫和集合。

這很重要

請勿使用您在生產環境中使用的 MongoDB 資料庫。 在本教學課程中,您會將 MongoDB 連接字串儲存在這些 MongoDB 實例之一的環境變數中(這對於任何能夠檢查您容器的人來說都可觀察得到,例如使用 docker inspect)。

本機 MongoDB

讓我們從使用 Azure CLI 建立 MongoDB 的本機實例開始。

  1. 安裝 MongoDB (如果尚未安裝)。

    您可以使用 MongoDB Shell(mongosh) 來檢查 MongoDB 的安裝。 如果下列命令無法運作,您可能需要明確 安裝 mongosh將 mongosh 連線到 MongoDB 伺服器

    • 使用下列命令來開啟 MongoDB 殼層,並取得 MongoDB 殼層和 MongoDB 伺服器的版本:

      mongosh
      

      小提示

      若要只傳回安裝在系統上的 MongoDB 伺服器版本,請關閉並重新開啟 MongoDB 殼層,並使用下列命令: mongosh --quiet --exec 'db.version()'

      在某些設定中,您也可以直接在命令提示字元中啟動 Mongo 服務。

      mongod --version
      
  2. 編輯資料夾中的 \MongoDB\Server\8.0\bin 檔案,並將電腦的本機 IP 位址新增至bindIP密鑰。

    bindip MongoD 組態檔中的金鑰會定義 MongoDB 接聽用戶端連線的主機名和 IP 位址。 新增您本地開發電腦的當前IP。 在 Docker 容器中本機執行的範例 Python Web 應用程式會使用此位址與主計算機通訊。

    例如,組態檔的一部分看起來應該像這樣:

    net:
      port: 27017
      bindIp: 127.0.0.1,<local-ip-address>
    
  3. 將變更儲存至此組態檔。

    這很重要

    您需要系統管理許可權,才能儲存您對這個組態檔所做的變更。

  4. 重新啟動 MongoDB 以套用設定檔的變更。

  5. 開啟 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」。。

適用於MongoDB的Azure Cosmos DB

現在,我們也會使用 Azure CLI 建立適用於 MongoDB 的 Azure Cosmos DB 實例。

備註

在本教學課程系列的第 4 部分中,您會使用適用於 MongoDB 的 Azure Cosmos DB 實例,在 Azure App Service 中執行 Web 應用程式。

執行下列腳本之前,請以適當的值取代位置、資源群組和適用於 MongoDB 的 Azure Cosmos DB 帳戶名稱(選擇性)。 建議您針對本教學課程中建立的所有 Azure 資源使用相同的資源群組,讓您在完成時更容易刪除。

指令碼需要幾分鐘的執行時間。

#!/bin/bash
# LOCATION: The Azure region. Use the "az account list-locations -o table" command to find a region near you.
LOCATION='westus'
# RESOURCE_GROUP_NAME: The resource group name, which can contain underscores, hyphens, periods, parenthesis, letters, and numbers.
RESOURCE_GROUP_NAME='msdocs-web-app-rg'
# ACCOUNT_NAME: The Azure Cosmos DB for MongDB account name, which can contain lowercase letters, hyphens, and numbers.
ACCOUNT_NAME='msdocs-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 restaurants_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 連接字串 複製到剪貼簿或其他位置。

{
  "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 資料庫延伸模組Azure 入口網站

小提示

在 VS Code Azure 資料庫擴充功能中,您可以以滑鼠右鍵按兩下 MongoDB 伺服器並取得連接字串。

在本機上的容器中執行映像檔

您現在已準備好使用本機 MongoDB 實例或適用於 MongoDB 的 Cosmos DB 實例在本機執行 Docker 容器。 在本教學課程的本節中,您會瞭解如何使用 VS Code 或 Azure CLI 在本機執行映射。 範例應用程式預期 MongoDB 的連線資訊會透過環境變數傳入。 有數種方式可將環境變數傳遞至在本地執行的容器。 每個都有安全性方面的優點和缺點。 您應該避免簽入任何敏感性資訊,或將敏感性資訊留在容器中的程序代碼中。

備註

將 Web 應用程式部署至 Azure 時,Web 應用程式會從設定為 App Service 組態設定的環境值取得連線資訊,而且不會套用本機開發環境案例的修改。

MongoDB 本機

使用下列命令搭配 MongoDB 的本機實例,在本機執行 Docker 映像。

  1. 執行最新版的映像。

    #!/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
    
  2. 確認容器正在執行。 在另一個控制台視窗中,執行 docker container ls 命令。

    docker container ls
    

    在清單中查看您的容器 「msdocspythoncontainerwebapp:latest:latest」。。 NAMES請注意輸出和數據PORTS行的數據行。 使用容器名稱來停止容器。

  3. 測試 Web 應用程式。

    移至 “http://127.0.0.1:8000"針對 Django 和 “http://127.0.0.1:5000/"代表 Flask。

  4. 關閉容器。

    docker container stop <container-name>
    

適用於MongoDB的Azure Cosmos DB

使用下列命令搭配 Azure Cosmos DB for MongoDB 實例,在 Azure 中執行 Docker 映像。

  1. 執行最新版的映像。

    #!/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
    

    僅針對示範目的顯示傳入敏感性資訊。 您可以使用 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/"代表 Flask。

  4. 關閉容器。

    docker container stop <container-name>
    

您也可以從映像啟動容器,並使用 Docker Desktop 應用程式加以停止。

後續步驟