Поделиться через


Создание и запуск контейнерного веб-приложения 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 создается из Файла Docker , который определяет содержимое и поведение образа. 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.

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

    docker images
    

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

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

Примечание.

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

Настройка MongoDB

Веб-приложение Python требует базы данных MongoDB с именем restaurants_reviews , а для хранения данных требуется коллекция с именем 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 ключ.

    Ключ 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 из вывода последней команды в буфер обмена или другое место.

{
  "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" \
      --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. Тестирование веб-приложения.

    Перейдите в раздел "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: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 .

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