Crie e execute um aplicativo Web Python em contêiner localmente com o MongoDB
Artigo
Este artigo faz parte de um tutorial sobre como contentorizar e implementar uma aplicação Web Python em contentores no Serviço de Aplicações do Azure. O Serviço de Aplicativo permite que você execute aplicativos Web em contêineres e implante por meio de recursos de integração contínua/implantação contínua (CI/CD) com o Docker Hub, o Registro de Contêiner do Azure e o Visual Studio Team Services. Nesta parte do tutorial, você aprenderá a criar e executar o aplicativo Web Python em contêiner localmente. Esta etapa é opcional e não é necessária para implantar o aplicativo de exemplo no Azure.
A execução de uma imagem do Docker localmente em seu ambiente de desenvolvimento requer uma configuração além da implantação no Azure. Pense nisso como um investimento que pode facilitar os ciclos de desenvolvimento futuros, especialmente quando você vai além de aplicativos de exemplo e começa a criar seus próprios aplicativos Web. Para implantar os aplicativos de exemplo para Django e Flask, você pode pular esta etapa e ir para a próxima etapa neste tutorial. Você sempre pode retornar após a implantação no Azure e seguir estas etapas.
O diagrama de serviço a seguir destaca os componentes abordados neste artigo.
Selecione Código e, em seguida, selecione Baixar ZIP.
Descompacte o arquivo ZIP em uma pasta e, em seguida, abra uma janela de terminal nessa pasta.
2. Crie uma imagem do Docker
Se você estiver usando um dos aplicativos de exemplo de estrutura disponíveis para Django e Flask, você está pronto para ir. Se você estiver trabalhando com seu próprio aplicativo de exemplo, dê uma olhada para ver como os aplicativos de exemplo são configurados, em particular o Dockerfile no diretório raiz.
Estas instruções requerem o Visual Studio Code e a extensão Docker. Vá para a pasta de exemplo que você clonou ou baixou e abra o VS Code com o comando code ..
Nota
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.
Instruções
Captura de ecrã
Abra a extensão Docker.
Se a extensão do Docker relatar um erro "Falha ao conectar", verifique se o Docker está instalado e em execução. Se esta for a primeira vez que você trabalha com o Docker, você provavelmente não terá contêineres, imagens ou registros conectados.
Construa a imagem.
No Project Explorer mostrando os arquivos do projeto, clique com o botão direito do mouse no Dockerfile e selecione Build Image....
Como alternativa, você pode usar a Paleta de Comandos (F1 ou Ctrl+Shift+P) e digitar "Docker Images: Build Images" para invocar o comando.
Para obter mais informações sobre a sintaxe do Dockerfile, consulte a referência do Dockerfile.
Confirme se a imagem foi construída.
Vá para a seção IMAGENS da extensão Docker.
Procure uma imagem criada recentemente. O nome da imagem do contêiner é "msdocspythoncontainerwebapp", que é definido no arquivo .vscode/tasks.json .
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.
Comece na raiz do aplicativo de exemplo que você clonou ou baixou.
Passo 1. Em um prompt de shell, confirme se o Docker está acessível.
docker
Se depois de executar este comando, você vir ajuda para a CLI do Docker, continue. Caso contrário, verifique se o Docker está instalado ou se seu shell tem acesso à CLI do Docker.
Passo 2. Construa a imagem.
A forma geral do comando 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>".
Por exemplo, se você estiver na raiz do diretório do projeto, poderá usar o comando desta forma para criar uma imagem:
Observe o ponto (".") no final do comando, referindo-se à corrente diretamente na qual o comando é executado. Você pode adicionar --no-cache para forçar uma reconstrução.
Você deve ver as imagens listadas por nome do REPOSITÓRIO, TAG e data de criação, entre outras características da imagem.
Neste ponto, você construiu uma imagem localmente. A imagem que você criou tem o nome "msdocspythoncontainerwebapp" e a tag "latest". As tags são uma maneira de definir informações de versão, uso pretendido, estabilidade ou outras informações. Para obter mais informações, consulte Recomendações para marcação e controle de versão de imagens de contêiner.
As imagens criadas a partir do VS Code ou do uso direto da CLI do Docker também podem ser visualizadas com o aplicativo Docker Desktop .
3. Configurar o MongoDB
Para este tutorial, você precisa de um banco de dados MongoDB chamado restaurants_reviews e uma coleção chamada restaurants_reviews. As etapas nesta seção mostram como usar uma instalação local do MongoDB ou 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ê usará na produção. Neste tutorial, você armazenará a cadeia de conexão MongoDB em uma variável de ambiente. Isso o torna observável por qualquer pessoa capaz de inspecionar seu contêiner (por exemplo, usando docker inspect).
O comando a seguir entra no shell e fornece a versão do servidor mongosh e mongoDB instalado no seu sistema:
mongosh
O comando a seguir fornece apenas a versão do servidor MongoDB instalada no seu sistema:
mongosh --quiet --exec 'db.version()'
Se esses comandos não funcionarem, talvez seja necessário instalar explicitamente o mongosh ou conectar o mongosh ao seu servidor MongoDB.
Uma alternativa em algumas instalações é invocar diretamente o daemon Mongo.
mongod --version
Passo 2: Edite o arquivo mongod.cfg para adicionar o endereço IP do seu computador.
O arquivo de configuração mongod tem uma bindIp chave que define 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 de exemplo executado localmente em um contêiner do Docker se comunicará com a máquina host com esse endereço.
Por exemplo, parte do arquivo de configuração deve ter esta aparência:
Reinicie o MongoDB para pegar as alterações no arquivo de configuração.
Etapa 3: Crie um banco de dados e uma coleção no banco de dados MongoDB local.
Defina o nome do banco de dados como "restaurants_reviews" e o nome da coleção como "restaurants_reviews". Você pode criar um banco de dados e uma coleção com a extensão VS Code MongoDB, o MongoDB Shell (mongosh) ou qualquer outra ferramenta compatível com MondoDB.
Para o shell do MongoDB, aqui estão exemplos de comandos para criar o banco de dados e a coleção:
> help
> use restaurants_reviews
> db.restaurants_reviews.insertOne({})
> show dbs
> exit
Neste ponto, sua 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".
Você pode usar os comandos da CLI do Azure para criar uma conta do Azure Cosmos DB para MongoDB e, em seguida, criar o banco de dados e a coleção necessários para este tutorial. Se você não tiver usado a CLI do Azure antes, 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.
Antes de executar o script a seguir, substitua o local e o nome da conta do Azure Cosmos DB para MongoDB pelos valores apropriados. Você pode usar o nome do grupo de recursos especificado no script ou alterá-lo. De qualquer forma, recomendamos usar o mesmo grupo de recursos para todos os recursos do Azure criados nos diferentes artigos deste tutorial. Isso facilita a exclusão quando você termina o tutorial. Se você chegou aqui da parte 4. Implante o Serviço de Aplicativo de contêiner, use o nome e o local do grupo de recursos que você já está usando para seus recursos.
O script pressupõe que você esteja usando um shell Bash. Se você quiser usar um shell diferente, precisará alterar a declaração de variável e a sintaxe de substituição. O script pode levar 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.
# RESOURCE_GROUP_NAME: The resource group name. Can contain underscores, hyphens, periods, parenthesis, letters, and numbers.
# ACCOUNT_NAME: The Azure Cosmos DB for MongDB account name. Can contain lowercase letters, hyphens, and numbers.
LOCATION='eastus'
RESOURCE_GROUP_NAME='msdocs-web-app-rg'
ACCOUNT_NAME='<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 restaraunts_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 Primária da saída do último comando.
Neste ponto, você deve 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.
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.
4. Execute a imagem localmente em um contêiner
Com informações sobre como se conectar a um MongoDB, você está pronto para executar o contêiner localmente. O aplicativo de exemplo espera que as informações de conexão do MongoDB sejam passadas em 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 fazer check-in de qualquer informação sensível ou deixar informações confidenciais em código no contêiner.
Nota
Quando implantado no Azure, o aplicativo Web obterá 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.
Na pasta .vscode do aplicativo de exemplo, o arquivo settings.json define o que acontece quando você usa a extensão Docker e seleciona Executar ou Executar interativo no menu de contexto de uma tag. O arquivo settings.json contém dois modelos cada para os (MongoDB local) cenários e (MongoDB Azure) .
Se você estiver usando um banco de dados MongoDB local:
Substitua ambas as instâncias de <YOUR_IP_ADDRESS> pelo seu endereço IP.
Substitua ambas as instâncias de pela cadeia de conexão do banco de <CONNECTION_STRING> dados MongoDB.
Se você estiver usando um banco de dados do Azure Cosmos DB para MongoDB:
Substitua ambas as instâncias da pela cadeia de <CONNECTION_STRING> conexão do Azure Cosmos DB para MongoDB.
Defina a docker.dockerPath definição de configuração usada pelos modelos. Para definir docker.dockerPatho , abra a paleta de comandos VS Code (Ctrl+Shift+P), digite "Preferências: abrir configurações do espaço de trabalho" e digite "docker.dockerPath" na caixa Configurações de pesquisa. Digite "docker" (sem as aspas) para o valor da configuração.
Nota
Presume-se que o nome do banco de dados e o nome da coleção sejam restaurants_reviews.
Execute a imagem.
Na seção IMAGENS da extensão Docker, localize a imagem construída.
Expanda a imagem para encontrar a tag mais recente, clique com o botão direito do mouse e selecione Executar interativo.
Você será solicitado a selecionar a tarefa apropriada para seu cenário, "Configuração de execução interativa (MongoDB local)" ou "Configuração de execução interativa (MongoDB Azure)".
Com a execução interativa, você verá todas as instruções de impressão no código, o que pode ser útil para depuração. Você também pode selecionar Executar , que não é interativo e não mantém a entrada padrão aberta.
Importante
Esta etapa falhará se o perfil de terminal padrão estiver definido como Prompt de Comando (Windows). Para alterar o perfil padrão, abra a paleta de comandos VS Code (Ctrl+Shift+P), digite "Terminal: Select Default Profile" e selecione um perfil diferente no menu suspenso, por exemplo, Git Bash ou PowerShell.
Confirme se o contêiner está em execução.
Na seção CONTAINERS da extensão do Docker, localize o contêiner.
Expanda o nó Contêineres Individuais e confirme se "msdocspythoncontainerwebapp" está em execução. Você verá um símbolo de triângulo verde ao lado do nome do contêiner se ele estiver em execução.
Teste o aplicativo Web clicando com o botão direito do mouse no nome do contêiner e selecionando Abrir no navegador.
O navegador será aberto no seu navegador padrão como "http://127.0.0.1:8000" para Django ou "http://127.0.0.1:5000/" para Flask.
Pare o contentor.
Na seção CONTAINERS da extensão do Docker, localize o contêiner em execução.
Clique com o botão direito do mouse no contêiner e selecione Parar.
Gorjeta
Você também pode executar o contêiner selecionando uma configuração de execução ou depuração. As tarefas de extensão do Docker em tasks.json são chamadas quando você executa ou depura. A tarefa chamada depende da configuração de inicialização selecionada. Para a tarefa "Docker: Python (MongoDB local)", especifique <YOUR-IP-ADDRESS>. Para a tarefa "Docker: Python (MongoDB Azure)", especifique <CONNECTION-STRING.>
# PORT=8000 for Django and 5000 for Flask
export PORT=<port-number>
export YOUR_IP_ADDRESS=<your-machine-ip-address>
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 \
msdocspythoncontainerwebapp:latest
O comando acima está formatado para shell Bash. Se você usar o PowerShell, o Prompt de Comando ou outro shell, talvez seja necessário ajustar a continuação da linha e o formato da variável de ambiente de acordo.
# 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 \
msdocspythoncontainerwebapp:latest
O comando acima está formatado para shell Bash. Se você usar o PowerShell, o Prompt de Comando ou outro shell, talvez seja necessário ajustar a continuação da linha e o formato da variável de ambiente de acordo.
A transmissão de informações confidenciais, como mostrado aqui, é 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.
Passo 2. Confirme se o contêiner está em execução.
Você deve ver seu contêiner "msdocspythoncontainerwebapp:latest:latest" na lista. Observe a NAMES coluna da saída e a PORTS coluna. Você pode usar o nome para parar o contêiner.
Passo 3. Teste o aplicativo Web.
Vá para "http://127.0.0.1:8000" para Django e "http://127.0.0.1:5000/" para Flask quando executado com MongoDB local.
Passo 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 .