本教程系列的这一部分介绍如何在本地计算机上生成和运行容器化 Django 或 Flask Python Web 应用。 若要存储此应用的数据,可以使用本地 MongoDB 实例或 Azure Cosmos DB for MongoDB。 本文是 5 部分教程系列的第 2 部分。 建议在开始本文之前完成 第 1 部分 。
以下服务关系图重点介绍了本文中介绍的本地组件。本文还介绍如何将 Azure Cosmos DB for MongdoDB 与本地 Docker 映像(而不是 MongoDB 的本地实例)配合使用。
克隆或下载示例 Python 应用
在本部分中,将克隆或下载用于生成 Docker 映像的示例 Python 应用。 可以在 Django 或 Flask Python Web 应用之间进行选择。 如果你有自己的 Python Web 应用,可以选择改用它。 如果使用自己的 Python Web 应用,请确保应用在根文件夹中具有 Dockerfile ,并且可以连接到 MongoDB 数据库。
使用以下命令之一将 Django 或 Flask 存储库克隆到本地文件夹中:
导航到克隆存储库的根文件夹。
生成 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 CLI 生成 Docker 映像。 安装 Docker 后,打开终端窗口并导航到示例文件夹。
注释
本部分中的步骤要求 Docker 守护程序正在运行。 在某些安装(例如在 Windows 上)中,需要打开 Docker Desktop(在继续之前启动守护程序)。
通过在示例应用的根文件夹中运行以下命令,确认 Docker 可访问。
docker
如果在运行此命令后,会看到 Docker CLI 的帮助,则 Docker 可访问。 否则,请确保已安装 Docker,并且 shell 有权访问 Docker CLI。
使用 Docker 生成 命令为 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" \ .
使用 Docker 映像 命令确认映像是否已成功生成。
docker images
该命令按存储库名称、TAG 和 CREATED 日期返回映像列表以及其他映像特征。
此时,你有一个名为“msdocspythoncontainerwebapp”的本地 Docker 映像,其标记为“latest”。 标记有助于定义版本详细信息、预期用途、稳定性和其他相关信息。 有关详细信息,请参阅有关对容器映像进行标记和版本控制的建议。
注释
也可通过 Docker Desktop 应用程序查看从 VS Code 或直接使用 Docker CLI 生成的映像。
设置 MongoDB
Python Web 应用需要名为 restaurants_reviews 的 MongoDB 数据库,并且需要一个名为 restaurants_reviews 的集合来存储数据。 本教程使用 MongoDB 的本地安装和 用于 MongoDB 的 Azure Cosmos DB 实例来创建和访问数据库和集合。
重要
请勿使用生产中使用的 MongoDB 数据库。 在本教程中,您将 MongoDB 连接字符串存储在环境变量中,以连接到这些 MongoDB 实例中的一个。这些环境变量是可观察的,任何能够检查您的容器的人,例如使用 docker inspect
,都可以看到这些变量。
本地 MongoDB
首先,使用 Azure CLI 创建 MongoDB 的本地实例。
安装 MongoDB (如果尚未安装)。
可以使用 MongoDB Shell (mongosh) 检查 MongoDB 的安装情况。 如果以下命令不起作用,可能需要显式 安装 mongosh 或 将 mongosh 连接到 MongoDB 服务器。
使用以下命令打开 MongoDB shell 并获取 MongoDB shell 和 MongoDB 服务器的版本:
mongosh
小提示
若要仅返回系统上安装的 MongoDB 服务器版本,请关闭并重新打开 MongoDB shell,并使用以下命令:
mongosh --quiet --exec 'db.version()'
在某些设置中,还可以直接在 bash shell 中调用 Mongo 守护程序。
mongod --version
编辑文件夹中的 mongod.cfg 文件
\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>
保存对此配置文件所做的更改。
重要
需要管理权限才能保存对此配置文件所做的更改。
重启 MongoDB,以选取配置文件的更改。
打开 MongoDB shell 并运行以下命令,将数据库名称设置为“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”。
Azure Cosmos DB 适用于 MongoDB
现在,我们还使用 Azure CLI 创建 Azure Cosmos DB for MongoDB 实例。
注释
在本教程系列的第 4 部分中,使用 Azure Cosmos DB for MongoDB 实例在 Azure 应用服务中运行 Web 应用。
运行以下脚本之前,请将位置、资源组和 Azure Cosmos DB for MongoDB 帐户名称替换为适当的值(可选)。 建议对本教程中创建的所有 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://<server-name>:<password>@<server-name>.mongo.cosmos.azure.com:10255/?ssl=true&<other-parameters>
的 Azure Cosmos DB for MongoDB 连接字符串、一个名为 restaurants_reviews
的数据库和一个名为 restaurants_reviews
的集合。
有关如何使用 Azure CLI 创建 Cosmos DB for MongoDB 帐户和创建数据库和集合的详细信息,请参阅 使用 Azure CLI 创建 MongoDB for Azure Cosmos DB 的数据库和集合。 还可以使用 PowerShell、VS Code Azure 数据库扩展和 Azure 门户。
小提示
在 VS Code Azure 数据库扩展中,可以右键单击 MongoDB 服务器并获取连接字符串。
在本地容器中运行映像
现在,可以使用本地 MongoDB 实例或 Cosmos DB for MongoDB 实例在本地运行 Docker 容器。 本教程的此部分介绍如何使用 VS Code 或 Azure CLI 在本地运行映像。 示例应用要求使用环境变量将 MongoDB 连接信息传入其中。 可通过多种方式将环境变量传递到本地容器。 每一个在安全性方面都有优点和缺点。 应避免签入任何敏感信息或在容器中的代码中留下敏感信息。
注释
将 Web 应用部署到 Azure 时,Web 应用将从环境值获取连接信息,这些值设置为应用服务配置设置,并且不会对本地开发环境方案进行任何修改。
MongoDB 本地
将以下命令与 MongoDB 的本地实例配合使用,在本地运行 Docker 映像。
运行最新版本的映像。
#!/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
确认容器正在运行。 在另一个控制台窗口中,运行 docker 容器 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>
Azure Cosmos DB 适用于 MongoDB
将以下命令与 Azure Cosmos DB for MongoDB 实例配合使用,在 Azure 中运行 Docker 映像。
运行最新版本的映像。
#!/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 功能。
打开新的控制台窗口,运行以下 docker 容器 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 应用程序停止该容器。