Compartilhar via


Compilar e executar um aplicativo Web Python em contêineres localmente

Nesta parte da série de tutoriais, você aprenderá a criar 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 realça 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êineres no Azure com a parte local realçada.

Clonar ou baixar o aplicativo Python de exemplo

Nesta seção, você clonará ou baixará o aplicativo Python de exemplo que você 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, verifique se seu aplicativo tem um Dockerfile na pasta raiz e pode se conectar a um banco de dados do 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ê criará 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 runtime 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 por conta própria).

Dica

Se você não estiver familiarizado com a 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 continuar.

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

    docker
    

    Se, depois de executar esse comando, você veja a ajuda sobre a CLI do Docker, o Docker estará acessível. Caso contrário, verifique se o Docker está instalado e se o shell tem acesso à CLI do Docker.

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

    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 comando a seguir 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 recompilaçã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 de imagens do Docker .

    docker images
    

    O comando retorna uma lista de imagens por nome REPOSITÓRIO, TAG e data CREATED entre outras características da imagem.

Neste ponto, você tem uma imagem local do Docker chamada "msdocspythoncontainerwebapp" com a tag "mais recente". Tags ajudam a definir detalhes da versão, o uso pretendido, a estabilidade e outras informações relevantes. Para mais informações, vejaRecomendações para marcação e controle de versão de imagens de contêiner.

Observação

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

Configurar o MongoDB

Seu aplicativo Web Python requer um banco de dados do MongoDB chamado restaurants_reviews e uma coleção chamada restaurants_reviews são necessárias para armazenar dados. Neste tutorial, você usará 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 do MongoDB usado em produção. Neste tutorial, você armazenará a cadeia de conexão do MongoDB para 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).

MongoDB 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 Shell do MongoDB (mongosh). Se os comandos a seguir não funcionarem, talvez seja necessário instalar explicitamente o mongosh ou conectar mongosh ao 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
      

      Dica

      Para retornar apenas a versão do servidor MongoDB instalada em 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 do 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 os endereços IP que o MongoDB escuta para conexões de cliente. Adicione o IP atual do computador de desenvolvimento local. O aplicativo Web Python de exemplo em execução 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 nesse 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 obter alterações no arquivo de configuração.

  5. Abra um shell do MongoDB e execute o comando a seguir 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 mongoDB do VS Code ou qualquer outra ferramenta com reconhecimento do MongoDB.

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

Depois de concluir a etapa anterior, a cadeia de conexão local do MongoDB é "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). É recomendável 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 do MongoDB primário da saída do último comando para sua á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 nomeado 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 MongoDB para o Azure Cosmos DB usando a CLI do Azure. Você também pode usar o PowerShell, a extensão de Bancos de Dados do Azure do VS Code e o portal do Azure.

Dica

Na extensão bancos de dados do Azure do VS Code, 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 usar ou deixar quaisquer informações confidenciais no código no contêiner.

Observação

Quando o aplicativo web é implantado no Azure, ele obtém informações de conexão de variáveis de ambiente definidas nas configurações do App Service e essas modificações não se aplicam no cenário de desenvolvimento local.

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. Verifique 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 interromper 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 contêiner.

    docker container stop <container-name>
    

Azure Cosmos DB para MongoDB

Use os comandos a seguir com a 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 apresentação de informações sensíveis é feita apenas para fins de demonstração. As informações da cadeia de conexão podem ser exibidas 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 de contêiner do Docker 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 interromper 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 contêiner.

    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óxima etapa