Partilhar via


Crie e execute um aplicativo Web Python em contêiner localmente

Nesta parte da série de tutoriais, você aprenderá a construir e executar um Django em contêineres ou um aplicativo web Flask Python em seu computador local. Para armazenar dados para este aplicativo, você pode usar uma instância local do MongoDB ou o Azure Cosmos DB para MongoDB. Este artigo é a parte 2 de uma série de tutoriais de 5 partes. Recomendamos que você conclua a parte 1 antes de iniciar este artigo.

O diagrama de serviço a seguir destaca os componentes locais abordados neste artigo Neste artigo, você também aprenderá a usar o Azure Cosmos DB para MongdoDB com uma imagem local do Docker, em vez de uma instância local do MongoDB.

Uma captura de tela do Tutorial - Aplicativo Python em contêiner no Azure com a parte local realçada.

Clone ou baixe a aplicação Python exemplificativa

Nesta seção, você clona ou baixa o aplicativo Python de exemplo que usa para criar uma imagem do Docker. Você pode escolher entre um aplicativo web Django ou Flask Python. Se você tiver seu próprio aplicativo Web Python, poderá optar por usá-lo. Se você usar seu próprio aplicativo Web Python, certifique-se de que seu aplicativo tenha um Dockerfile na pasta raiz e possa se conectar a um banco de dados MongoDB.

  1. Clone o repositório Django ou Flask em uma pasta local usando um dos seguintes comandos:

    # Django
    git clone https://github.com/Azure-Samples/msdocs-python-django-container-web-app.git
    
  2. Navegue até a pasta raiz do repositório clonado.

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

Criar uma imagem do Docker

Nesta seção, você cria uma imagem do Docker para o aplicativo Web Python usando o Visual Studio Code ou a CLI do Azure. A imagem do Docker contém o aplicativo Web Python, suas dependências e o tempo de execução do Python. A imagem do Docker é criada a partir de um Dockerfile que define o conteúdo e o comportamento da imagem. O Dockerfile está na pasta raiz do aplicativo de exemplo que você clonou ou baixou (ou forneceu você mesmo).

Sugestão

Se você é novo na CLI do Azure, consulte Introdução à CLI do Azure para saber como baixar e instalar a CLI do Azure localmente ou como executar comandos da CLI do Azure no Azure Cloud Shell.

O Docker é necessário para criar a imagem do Docker usando a CLI do Docker. Depois que o Docker estiver instalado, abra uma janela do terminal e navegue até a pasta de exemplo.

Observação

As etapas nesta seção exigem que o daemon do Docker esteja em execução. Em algumas instalações, por exemplo, no Windows, você precisa abrir o Docker Desktop, que inicia o daemon, antes de prosseguir.

  1. Confirme se o Docker está acessível executando o seguinte comando na pasta raiz do aplicativo de exemplo.

    docker
    

    Se, depois de executar este comando, conseguires ver a ajuda para a CLI do Docker, o Docker estará acessível. Caso contrário, verifique se o Docker está instalado e se seu shell tem acesso à CLI do Docker.

  2. Crie a imagem do Docker para o aplicativo Web Python usando o comando Docker build .

    A forma geral do comando é 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>".

    Se você estiver na pasta raiz do projeto, use o seguinte comando para criar a imagem do Docker. O ponto (".") no final do comando refere-se ao diretório atual no qual o comando é executado. Para forçar uma reconstrução, adicione --no-cache.

    #!/bin/bash
    docker build --rm --pull \
      --file "Dockerfile" \
      --label "com.microsoft.create-by=docker-cli" \
      --tag "msdocspythoncontainerwebapp:latest" \
        .
    
  3. Confirme se a imagem foi criada com êxito usando o comando Docker images .

    docker images
    

    O comando retorna uma lista de imagens por nome do repositório, TAG e data de criação, entre outras características da imagem.

Neste ponto, você tem uma imagem local do Docker chamada "msdocspythoncontainerwebapp" com a tag "mais recente". As tags ajudam a definir detalhes da versão, uso pretendido, estabilidade e outras informações relevantes. Para obter mais informações, consulte Recomendações para etiquetagem e versionamento de imagens de contêiner.

Observação

As imagens criadas a partir do VS Code ou usando diretamente a CLI do Docker também podem ser visualizadas com o aplicativo Docker Desktop .

Configurar o MongoDB

Seu aplicativo Web Python requer um banco de dados MongoDB chamado restaurants_reviews e uma coleção chamada restaurants_reviews são necessários para armazenar dados. Neste tutorial, você usa uma instalação local do MongoDB e uma instância do Azure Cosmos DB para MongoDB para criar e acessar o banco de dados e a coleção.

Importante

Não use um banco de dados MongoDB que você usa na produção. Neste tutorial, você armazena a cadeia de conexão do MongoDB em uma dessas instâncias do MongoDB em uma variável de ambiente (que é observável por qualquer pessoa capaz de inspecionar seu contêiner - como usando docker inspect).

Base de Dados Mongo Local

Vamos começar criando uma instância local do MongoDB usando a CLI do Azure.

  1. Instale o MongoDB (se ainda não estiver instalado).

    Você pode verificar a instalação do MongoDB usando o MongoDB Shell (mongosh). Se os comandos a seguir não funcionarem, talvez seja necessário instalar explicitamente o mongosh ou conectar o mongosh ao seu servidor MongoDB.

    • Use o seguinte comando para abrir o shell do MongoDB e obter a versão do shell do MongoDB e do servidor MongoDB:

      mongosh
      

      Sugestão

      Para retornar apenas a versão do servidor MongoDB instalada no seu sistema, feche e reabra o shell do MongoDB e use o seguinte comando: mongosh --quiet --exec 'db.version()'

      Em algumas configurações, você também pode invocar diretamente o daemon Mongo em seu shell bash.

      mongod --version
      
  2. Edite o arquivo mongod.cfg na pasta \MongoDB\Server\8.0\bin e adicione o endereço IP local do seu computador à chave bindIP.

    A bindip chave no arquivo de configuração do MongoD define os nomes de host e endereços IP que o MongoDB escuta para conexões de cliente. Adicione o IP atual do seu computador de desenvolvimento local. O aplicativo Web Python de exemplo executado localmente em um contêiner do Docker se comunica com o computador host com esse endereço.

    Por exemplo, parte do arquivo de configuração deve ter esta aparência:

    net:
      port: 27017
      bindIp: 127.0.0.1,<local-ip-address>
    
  3. Salve suas alterações neste arquivo de configuração.

    Importante

    Você precisa de privilégios administrativos para salvar as alterações feitas nesse arquivo de configuração.

  4. Reinicie o MongoDB para pegar as alterações no arquivo de configuração.

  5. Abra um shell do MongoDB e execute o seguinte comando para definir o nome do banco de dados como "restaurants_reviews" e o nome da coleção como "restaurants_reviews". Você também pode criar um banco de dados e uma coleção com a extensão VS Code MongoDB ou qualquer outra ferramenta compatível com MongoDB.

    > help
    > use restaurants_reviews
    > db.restaurants_reviews.insertOne({})
    > show dbs
    > exit
    

Depois de concluir a etapa anterior, a cadeia de conexão MongoDB local é "mongodb://127.0.0.1:27017/", o nome do banco de dados é "restaurants_reviews" e o nome da coleção é "restaurants_reviews".

Azure Cosmos DB para MongoDB

Agora, também vamos criar uma instância do Azure Cosmos DB para MongoDB usando a CLI do Azure.

Observação

Na parte 4 desta série de tutoriais, você usa a instância do Azure Cosmos DB para MongoDB para executar o aplicativo Web no Serviço de Aplicativo do Azure.

Antes de executar o script a seguir, substitua o local, o grupo de recursos e o nome da conta do Azure Cosmos DB para MongoDB por valores apropriados (opcional). Recomendamos usar o mesmo grupo de recursos para todos os recursos do Azure criados neste tutorial para torná-los mais fáceis de excluir quando você terminar.

O script leva alguns minutos para ser executado.

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

Quando o script for concluído, copie a Cadeia de Conexão MongoDB Principal da saída do último comando para a área de transferência ou outro local.

{
  "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"
    },

    ...
  ]
}

Depois de concluir a etapa anterior, você terá uma cadeia de conexão do Azure Cosmos DB para MongoDB do formulário mongodb://<server-name>:<password>@<server-name>.mongo.cosmos.azure.com:10255/?ssl=true&<other-parameters>, um banco de dados chamado restaurants_reviewse uma coleção chamada restaurants_reviews.

Para obter mais informações sobre como usar a CLI do Azure para criar uma conta do Cosmos DB para MongoDB e criar bancos de dados e coleções, consulte Criar um banco de dados e uma coleção para o MongoDB para Azure Cosmos DB usando a CLI do Azure. Você também pode usar o PowerShell, a extensão VS Code Azure Databases e o portal do Azure.

Sugestão

Na extensão VS Code Azure Databases, você pode clicar com o botão direito do mouse no servidor MongoDB e obter a cadeia de conexão.

Executar a imagem localmente em um contêiner

Agora você está pronto para executar o contêiner do Docker localmente usando sua instância local do MongoDB ou sua instância do Cosmos DB para MongoDB. Nesta seção do tutorial, você aprenderá a usar o VS Code ou a CLI do Azure para executar a imagem localmente. O aplicativo de exemplo espera que as informações de conexão do MongoDB sejam passadas para ele com variáveis de ambiente. Há várias maneiras de obter variáveis de ambiente passadas para o contêiner localmente. Cada um tem vantagens e desvantagens em termos de segurança. Você deve evitar registar quaisquer informações confidenciais ou deixar informações confidenciais em código no container.

Observação

Quando o aplicativo Web é implantado no Azure, o aplicativo Web obtém informações de conexão de valores de ambiente definidos como definições de configuração do Serviço de Aplicativo e nenhuma das modificações para o cenário de ambiente de desenvolvimento local se aplica.

MongoDB local

Use os comandos a seguir com sua instância local do MongoDB para executar a imagem do Docker localmente.

  1. Execute a versão mais recente da imagem.

    #!/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. Confirme se o contêiner está em execução. Em outra janela do console, execute o comando docker container ls .

    docker container ls
    

    Veja seu contêiner "msdocspythoncontainerwebapp:latest:latest" na lista. Observe a NAMES coluna da saída e a PORTS coluna. Use o nome do contêiner para parar o contêiner.

  3. Teste o aplicativo Web.

    Vá para "http://127.0.0.1:8000" para Django e "http://127.0.0.1:5000/" para Flask.

  4. Desligue o contentor.

    docker container stop <container-name>
    

Azure Cosmos DB para MongoDB

Use os comandos a seguir com sua instância do Azure Cosmos DB para MongoDB para executar a imagem do Docker no Azure.

  1. Execute a versão mais recente da imagem.

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

    A transmissão de informações confidenciais é mostrada apenas para fins de demonstração. As informações da cadeia de conexão podem ser visualizadas inspecionando o contêiner com o comando docker container inspect. Outra maneira de lidar com segredos é usar a funcionalidade BuildKit do Docker.

  2. Abra uma nova janela do console, execute o seguinte comando docker container ls para confirmar se o contêiner está em execução.

    docker container ls
    

    Veja seu contêiner "msdocspythoncontainerwebapp:latest:latest" na lista. Observe a NAMES coluna da saída e a PORTS coluna. Use o nome do contêiner para parar o contêiner.

  3. Teste o aplicativo Web.

    Vá para "http://127.0.0.1:8000" para Django e "http://127.0.0.1:5000/" para Flask.

  4. Desligue o contentor.

    docker container stop <container-name>
    

Você também pode iniciar um contêiner a partir de uma imagem e pará-lo com o aplicativo Docker Desktop .

Próximo passo