Создание и запуск контейнерного веб-приложения Python локально

В этой части серии учебников вы узнаете, как создать и запустить контейнерное веб-приложение Django или веб-приложение Flask Python на локальном компьютере. Для хранения данных для этого приложения можно использовать локальный экземпляр MongoDB или Azure Cosmos DB для MongoDB. Эта статья является частью серии из 5 руководств, и это — часть 2. Перед началом работы с этой статьей необходимо выполнить часть 1 .

На следующей схеме служб выделены локальные компоненты, описанные в этой статье. В этой статье вы также узнаете, как использовать Azure Cosmos DB для MongoDB с локальным образом Docker, а не локальным экземпляром MongoDB.

Снимок экрана руководства. Контейнерное приложение Python в Azure с выделенной локальной частью.

Клонирование или скачивание примера приложения Python

В этом разделе описано, как клонировать или скачать пример приложения Python, используемого для создания образа Docker. Вы можете выбрать веб-приложение Django или Flask Python. Если у вас есть собственное веб-приложение Python, вы можете использовать это вместо этого. Если вы используете собственное веб-приложение Python, убедитесь, что приложение имеет 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

В этом разделе описано, как создать образ Docker для веб-приложения Python с помощью Visual Studio Code или Azure CLI. Образ Docker содержит веб-приложение Python, его зависимости и среду выполнения Python. Вы создаете образ Docker из Dockerfile , который определяет содержимое и поведение образа. Dockerfile находится в корневой папке примера приложения, клонированного или скачаного (или предоставленного самостоятельно).

Подсказка

Если вы не знакомы с Azure CLI, см. статью "Начало работы с Azure CLI ", чтобы узнать, как скачать и установить Azure CLI локально или как выполнять команды Azure CLI в Azure Cloud Shell.

Чтобы создать образ Docker с помощью интерфейса командной строки Docker, вам потребуется Docker. После установки Docker откройте окно терминала и перейдите в образец папки.

Примечание.

Действия, описанные в этом разделе, требуют запуска управляющей программы Docker. В некоторых установках, таких как Windows, необходимо открыть Docker Desktop, которая запускает управляющую программу, прежде чем продолжить.

  1. Убедитесь, что Docker доступен, выполнив следующую команду в корневой папке примеров приложения.

    docker
    

    Если после выполнения этой команды вы увидите справку по интерфейсу командной строки Docker, значит Docker доступен. В противном случае убедитесь, что Docker установлен и у вашей оболочки есть доступ к Интерфейсу командной строки Docker.

  2. Создайте образ Docker для веб-приложения Python с помощью команды docker build.

    Общая форма команды 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.

    Примечание.

    В примере репозитория используется Python 3.8. Если вы создаете собственный файл Dockerfile, используйте поддерживаемую версию Python, например 3.12 или 3.13. Сведения о поддерживаемых в настоящее время версиях см. в разделе Поддержка версий Python.

    #!/bin/bash
    docker build --rm --pull \
      --file "Dockerfile" \
      --label "com.microsoft.created-by=docker-cli" \
      --tag "msdocspythoncontainerwebapp:latest" \
        .
    
  3. Убедитесь, что образ был успешно создан с помощью команды Docker images .

    docker images
    

    Команда возвращает список изображений по имени репозитория, ТЕГу и дате CREATED среди других характеристик изображения.

На этом этапе у вас есть локальный образ Docker с именем msdocspythoncontainerwebapp с тегом "latest". Теги помогают определить сведения о версии, предполагаемое использование, стабильность и другие важные сведения. Дополнительные сведения см. в статье Рекомендации по использованию тегов и управлению версиями образов контейнеров.

Примечание.

Вы также можете просматривать изображения, созданные из VS Code или с помощью интерфейса командной строки Docker непосредственно с помощью приложения Docker Desktop .

Настройка MongoDB

Для хранения данных в веб-приложении Python требуется база данных MongoDB и коллекция с именем restaurants_reviews. В этом руководстве вы используете как локальную установку MongoDB, так и экземпляр Azure Cosmos DB для MongoDB, чтобы создавать базу данных и коллекцию и получать к ним доступ.

Это важно

Не используйте базу данных MongoDB, используемую в рабочей среде. В этом руководстве сохраните в переменной среды строку подключения к одному из этих экземпляров MongoDB. Любой, кто может просмотреть содержимое вашего контейнера, например с помощью docker inspect, сможет увидеть эту строку подключения.

Локальный MongoDB

Создайте локальный экземпляр MongoDB с помощью Azure CLI.

  1. Установите MongoDB , если он еще не установлен.

    Чтобы проверить, установлен ли MongoDB, используйте оболочку MongoDB (mongosh). Если следующие команды не работают, может потребоваться явно установить mongosh или подключить mongosh к серверу MongoDB.

    • Используйте следующую команду, чтобы открыть оболочку MongoDB и получить версию оболочки MongoDB и сервера MongoDB:

      mongosh
      

      Подсказка

      Чтобы вернуть только версию сервера MongoDB, установленного в системе, закройте и снова откройте оболочку MongoDB и выполните следующую команду: mongosh --quiet --exec 'db.version()'

      В некоторых настройках можно также напрямую вызвать демон Mongo в bash.

      mongod --version
      
  2. Измените файл mongod.cfg в папке \MongoDB\Server\8.0\bin и добавьте локальный IP-адрес компьютера в bindIP ключ.

    Примечание.

    Путь к файлу конфигурации зависит от операционной системы и версии MongoDB. В macOS найдите /usr/local/etc/mongod.conf или /opt/homebrew/etc/mongod.conf. В Linux проверьте /etc/mongod.conf.

    Ключ bindip в файле конфигурации MongoD определяет имена узлов и IP-адреса, на которых MongoDB принимает клиентские подключения. Добавьте текущий IP-адрес локального компьютера разработки. Пример веб-приложения Python, работающего локально в контейнере Docker, взаимодействует с хост-компьютером с этим адресом.

    Например, часть файла конфигурации должна выглядеть следующим образом:

    net:
      port: 27017
      bindIp: 127.0.0.1,<local-ip-address>
    
  3. Сохраните изменения в этом файле конфигурации.

    Это важно

    Для сохранения изменений, внесенных в этот файл конфигурации, требуются права администратора.

  4. Перезапустите MongoDB, чтобы получить изменения в файле конфигурации.

  5. Откройте оболочку MongoDB и выполните следующую команду, чтобы задать для имени базы данных значение "restaurants_reviews", а имя коллекции — "restaurants_reviews". Вы также можете создать базу данных и коллекцию с помощью расширения MongoDB VS Code или любого другого средства с поддержкой 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 Cosmos DB для экземпляра MongoDB с помощью Azure CLI.

Примечание.

В части 4 этого руководства вы используете экземпляр Azure Cosmos DB для MongoDB для запуска веб-приложения в Службе приложений Azure.

Перед выполнением следующего скрипта замените расположение, группу ресурсов и имя учетной записи Azure Cosmos DB для 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"

После завершения скрипта скопируйте Primary MongoDB Connection 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"
    },

    ...
  ]
}

После выполнения предыдущего шага у вас есть строка подключения Azure Cosmos DB для MongoDB формы mongodb://<server-name>:<password>@<server-name>.mongo.cosmos.azure.com:10255/?ssl=true&<other-parameters>, база данных с именем restaurants_reviewsи коллекция с именем restaurants_reviews.

Дополнительные сведения об использовании Azure CLI для создания учетной записи Cosmos DB для MongoDB и создания баз данных и коллекций см. в статье "Создание базы данных и коллекции для MongoDB для Azure Cosmos DB с помощью Azure CLI". Вы также можете использовать PowerShell, расширение баз данных Azure VS Code и портал Azure.

Подсказка

В расширении Azure Databases в VS Code вы можете щелкнуть правой кнопкой мыши на сервере MongoDB, чтобы получить строку подключения.

Запустите образ локально в контейнере

Теперь вы готовы запустить контейнер Docker локально с помощью локального экземпляра MongoDB или экземпляра Cosmos DB для MongoDB. В этом разделе руководства вы узнаете, как использовать VS Code или Azure CLI для локального запуска образа. В примере приложения ожидается, что сведения о подключении MongoDB передаются с помощью переменных среды. Существует несколько методов для передачи переменных среды в контейнер локально. Каждый метод имеет преимущества и недостатки с точки зрения безопасности. Избегайте регистрации или выхода конфиденциальной информации в коде в контейнере.

Примечание.

При развертывании веб-приложения в Azure веб-приложение получает сведения о подключении из значений среды, заданных в качестве параметров конфигурации службы приложений. Ни одна из изменений для сценария локальной среды разработки не применяется.

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" \
      --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 в списке. Обратите внимание на столбец NAMES выходных данных и столбец PORTS. Используйте имя контейнера, чтобы остановить контейнер.

  3. Тестирование веб-приложения.

    Перейдите к http://127.0.0.1:8000 для Django и к http://127.0.0.1:5000/ для Flask.

  4. Выключите контейнер.

    docker container stop <container-name>
    

Azure Cosmos DB для MongoDB

Используйте следующие команды с экземпляром Azure Cosmos DB для MongoDB, чтобы запустить образ Docker в Azure.

  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 container inspect. Другим способом обработки секретов является использование функций BuildKit Docker.

  2. Откройте новое окно консоли и выполните следующую команду docker container ls , чтобы убедиться, что контейнер запущен.

    docker container ls
    

    Вы видите свой контейнер msdocspythoncontainerwebapp:latest в списке. Обратите внимание на столбец NAMES выходных данных и столбец PORTS. Используйте имя контейнера, чтобы остановить контейнер.

  3. Тестирование веб-приложения.

    Перейдите к http://127.0.0.1:8000 для Django и к http://127.0.0.1:5000/ для Flask.

  4. Выключите контейнер.

    docker container stop <container-name>
    

Вы также можете запустить контейнер из образа и остановить его с помощью приложения Docker Desktop.

Следующий шаг