Criar e executar um aplicativo Web Python em contêineres localmente com o MongoDB
Artigo
Este artigo faz parte de um tutorial sobre como conteinerizar e implantar um aplicativo Web Python em contêineres no Serviço de Aplicativo 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êineres 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 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 dos 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 ignorar esta etapa e ir para a próxima etapa neste tutorial. Você sempre pode retornar após a implantação no Azure e trabalhar com essas etapas.
O diagrama de serviço a seguir destaca os componentes abordados neste artigo.
Descompacte o arquivo ZIP em uma pasta e, em seguida, abra uma janela de terminal nessa pasta.
2. Criar 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 estão configurados, em particular o Dockerfile no diretório raiz.
Essas instruções exigem o Visual Studio Code e a extensão do Docker. Vá para a pasta de exemplo que você clonou ou baixou e abra o VS Code com o comando code ..
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.
Instruções
Captura de tela
Abra a extensão do 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 sua primeira vez trabalhando com o Docker, você provavelmente não terá contêineres, imagens ou registros conectados.
Crie a imagem.
No Project Explorer mostrando os arquivos de 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 IMAGES da extensão do Docker.
Procure a 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 continuar.
Comece na raiz do aplicativo de exemplo que você clonou ou baixou.
Etapa 1. Em um prompt de shell, confirme se o Docker está acessível.
docker
Se depois de executar esse comando, você vir ajuda para a CLI do Docker, em seguida, continuar. Caso contrário, verifique se o Docker está instalado ou se o shell tem acesso à CLI do Docker.
Etapa 2. Crie 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 como este para criar uma imagem:
Observe o ponto (".") no final do comando referente à corrente diretamente na qual o comando é executado. Você pode adicionar --no-cache para forçar uma reconstrução.
Você deve ver imagens listadas por nome do REPOSITÓRIO, TAG e data de CRIAÇÃO, entre outras características da imagem.
Neste ponto, você criou 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 mais informações, vejaRecomendaçõ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 exibidas 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 do 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 em seu sistema:
mongosh
O comando a seguir fornece apenas a versão do servidor MongoDB instalada em 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 chave que define nomes de host e endereços IP que o MongoDB escuta conexões de bindIp cliente. Adicione o IP atual do 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 obter alterações no arquivo de configuração.
Etapa 3: Criar um banco de dados e uma coleção no banco de dados local do MongoDB.
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 os comandos de exemplo para criar o banco de dados e a coleção:
> help
> use restaurants_reviews
> db.restaurants_reviews.insertOne({})
> show dbs
> exit
Neste ponto, 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".
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ê terminar 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ê está usando um shell Bash. Se você quiser usar um shell diferente, precisará alterar a sintaxe de declaração e substituição de variáveis. 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 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 Principal do MongoDB 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 confidencial ou deixar informações confidenciais em código no contêiner.
Observação
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 do Docker e seleciona Executar ou Executar interativo no menu de contexto de uma Tag. O arquivo settings.json contém dois modelos 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 do MongoDB.
Se você estiver usando um banco de dados do Azure Cosmos DB para MongoDB:
Substitua ambas as instâncias de 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 do 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.
Observação
Presume-se que o nome do banco de dados e o nome da coleção sejam restaurants_reviews.
Execute a imagem.
Na seção IMAGES da extensão do Docker, localize a imagem criada.
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 (Windows) Prompt de Comando. Para alterar o perfil padrão, abra a Paleta de Comandos do VS Code (Ctrl+Shift+P), digite "Terminal: Selecionar Perfil Padrão" 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 em seu navegador padrão como "http://127.0.0.1:8000" para Django ou "http://127.0.0.1:5000/" para Flask.
Pare o contêiner .
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.
Dica
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 o 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 o 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.
Passar informações confidenciais como mostrado aqui é 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.
Etapa 2. Confirme se o contêiner está em execução.
Abra um segundo shell e execute o comando ls do contêiner do docker.
docker container ls
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.
Etapa 3. Teste o aplicativo Web.
Vá para "http://127.0.0.1:8000" para Django e "http://127.0.0.1:5000/" para Flask ao executar com o MongoDB local.
Etapa 4. Desligar o contêiner
docker container stop <container-name>
Você também pode iniciar um contêiner a partir de uma imagem e interrompê-lo com o aplicativo Docker Desktop .