Implantar um aplicativo Web Flask ou FastAPI em contêineres no Serviço de Aplicativo do Azure
Este tutorial mostra como implantar um aplicativo Web Python Flask ou FastAPI para o Serviço de aplicativo do Azure usando o recurso Aplicativo Web para Contêineres. O Aplicativo Web para Contêineres fornece uma fácil rampa para os desenvolvedores aproveitarem a plataforma totalmente gerenciada do Serviço de aplicativo do Azure, mas que também querem um único artefato implantável contendo um aplicativo e todas as suas dependências. Para obter mais informações sobre como usar contêineres no Azure, consulte Comparando opções de contêiner do Azure.
Nesse tutorial você usa a CLI do Docker e o Docker para criar opcionalmente uma imagem do Docker e testá-la localmente. Use a CLI do Azure para criar uma imagem do Docker em um Registro de Contêiner do Azure e implantá-la no Serviço de Aplicativo do Azure. O aplicativo da Web é configurado com sua atribuição de sistema identidade gerenciada (conexões sem senha) e acesso baseado em função do Azure para efetuar pull da imagem do Docker do Registro de Contêiner do Azure durante a implantação. Você também pode implantar com o Visual Studio Code com a Extensão de Ferramentas do Azure instalada.
Para obter um exemplo de construção e criação de uma imagem do Docker para ser executada no Azure Container Apps, consulte Implantar um aplicativo Web Flask ou FastPI nos Aplicativos de Contêiner do Azure.
Observação
Este tutorial mostra a criação de uma imagem do Docker que pode ser executada no Serviço de Aplicativo. Isso não é necessário para usar o Serviço de Aplicativo. Você pode implantar o código diretamente de um workspace local no Serviço de Aplicativo sem criar uma imagem do Docker. Para um exemplo, consulte Início Rápido: Implantar um aplicativo Web Python (Django ou Flask) para o Serviço de Aplicativo do Azure.
Pré-requisitos
Para concluir este tutorial, você precisará de:
Uma conta do Azure na qual você pode implantar um aplicativo Web no Serviço de Aplicativo do Azure e no Registro de Contêiner do Azure. Se você não tiver uma assinatura do Azure, crie uma conta gratuita antes de começar.
CLI do Azure para criar uma imagem do Docker e implantá-la no Serviço de Aplicativo. E, opcionalmente, o Dockere a CLI do Docker para criar um Docker e testá-lo em seu ambiente local.
Obter o código de exemplo
Em seu ambiente local, obtenha o código.
git clone https://github.com/Azure-Samples/msdocs-python-flask-webapp-quickstart.git
cd msdocs-python-flask-webapp-quickstart
Adicionar arquivos Dockerfile e .dockerignore
Adicione um Dockerfile para instruir o Docker sobre como criar a imagem. O Dockerfile especifica o uso do Gunicorn, um servidor da Web em nível de produção que encaminha solicitações da Web para as estruturas Flask e FastAPI. Os comandos ENTRYPOINT e CMD instruem o Gunicorn a lidar com solicitações para o objeto do aplicativo.
# syntax=docker/dockerfile:1
FROM python:3.11
WORKDIR /code
COPY requirements.txt .
RUN pip3 install -r requirements.txt
COPY . .
EXPOSE 50505
ENTRYPOINT ["gunicorn", "app:app"]
50505
é usado para a porta do contêiner (interna) neste exemplo, mas você pode usar qualquer porta livre.
Verifique o arquivo requirements.txt para certificar-se de que ele contém gunicorn
.
Flask==2.2.2
gunicorn
Werkzeug==2.2.2
Adicione um arquivo .dockerignore para excluir arquivos desnecessários da imagem.
.git*
**/*.pyc
.venv/
Configurar gunicorn
O Gunicorn pode ser configurado com um arquivo gunicorn.conf.py. Quando o arquivo gunicorn.conf.py está localizado no mesmo diretório em que o gunicorn é executado, não é necessário especificar seu local no arquivo Dockerfile. Para obter mais informações sobre como especificar o arquivo de configuração, consulte Configurações do Gunicorn.
Neste tutorial, o arquivo de configuração sugerido configura o gunicorn para aumentar seu número de trabalhadores com base no número de núcleos de CPU disponíveis. Para obter mais informações sobre configurações de arquivo gunicorn.conf.py, consulte Configuração do Gunicorn.
# Gunicorn configuration file
import multiprocessing
max_requests = 1000
max_requests_jitter = 50
log_file = "-"
bind = "0.0.0.0:50505"
workers = (multiprocessing.cpu_count() * 2) + 1
threads = workers
timeout = 120
Criar e executar a imagem localmente
Crie a imagem localmente.
Observação
Se o comando docker build
retornar um erro, verifique se o docker deamon está em execução. No Windows, certifique-se de que o Docker Desktop esteja em execução.
Execute a imagem localmente em um contêiner do Docker.
docker run --detach --publish 5000:50505 flask-demo
Abra a URL http://localhost:5000
no seu navegador para ver o aplicativo Web em execução localmente.
A opção --detach
executa o contêiner em segundo plano. A opção --publish
mapeia a porta do contêiner para uma porta no host. A porta do host (externa) é a primeira no par e a porta do contêiner (interna) é a segunda. Para obter mais informações, confira Referência sobre docker run.
Criar um grupo de recursos e o Registro de Contêineres do Azure
Execute o comando az login para entrar no Azure.
az login
Execute o comando az upgrade para garantir que sua versão da CLI do Azure esteja atualizada.
az upgrade
Crie um grupo com o comando az group create.
az group create --name web-app-simple-rg --location eastus
Um grupo de recursos do Azure é um contêiner lógico no qual os recursos do Azure são implantados e gerenciados. Ao criar um grupo de recursos, você especifica um local, como eastus.
Crie um Registro de Contêiner do Azure com o comando az acr create.
az acr create --resource-group web-app-simple-rg \ --name webappacr123 --sku Basic
Observação
O nome do registro precisa ser exclusivo no Azure. Se você receber um erro, tente um nome diferente. Os nomes do Registro podem consistir em 5 a 50 caracteres alfanuméricos. Hifens e sublinhados não são permitidos. Para saber mais, consulte Regras de nome do Registro de Contêiner do Azure. Se você usar um nome diferente, certifique-se de usar seu nome em vez de
webappacr123
nos comandos que fazem referência ao Registro e aos artefatos do Registro nas seções a seguir.Um Registro de Contêiner do Azure é um registro privado do Docker que armazena imagens para uso em Instâncias de Contêiner do Azure, Serviço de Aplicativo do Azure, Serviço de Kubernetes do Azure e outros serviços. Ao criar um registro, você especifica um nome, SKU e grupo de recursos.
Criar a imagem no Registro de Contêiner do Azure
Crie a imagem do Docker no Azure com o comando az acr build. O comando usa o Dockerfile no diretório atual e envia a imagem para o registro.
az acr build \
--resource-group web-app-simple-rg \
--registry webappacr123 \
--image webappsimple:latest .
A opção --registry
especifica o nome do Registro e a opção --image
especifica o nome da imagem. O nome da imagem está no formato registry.azurecr.io/repository:tag
.
Implantar um aplicativo Web no Azure
Crie um plano do Serviço de Aplicativo com o comando az appservice plan.
az appservice plan create \ --name webplan \ --resource-group web-app-simple-rg \ --sku B1 \ --is-linux
Defina uma variável de ambiente como a sua ID da assinatura. Ele é usado no parâmetro
--scope
no próximo comando.SUBSCRIPTION_ID=$(az account show --query id --output tsv)
O comando para criar a variável de ambiente é mostrado para o shell Bash. Altere a sintaxe conforme apropriado para outros ambientes.
Crie um aplicativo Web, com o comando az webapp create.
az webapp create \ --resource-group web-app-simple-rg \ --plan webplan --name webappsimple123 \ --assign-identity [system] \ --role AcrPull \ --scope /subscriptions/$SUBSCRIPTION_ID/resourceGroups/web-app-simple-rg \ --acr-use-identity --acr-identity [system] \ --container-image-name webappacr123.azurecr.io/webappsimple:latest
Observações:
O nome do aplicativo Web deve ser exclusivo no Azure. Se você receber um erro, tente um nome diferente. O nome pode consistir em caracteres alfanuméricos e hífens, mas não pode começar ou terminar com um hífen. Para saber mais, consulte Regras de nomes da Microsoft.Web.
Se você estiver usando um nome diferente do
webappacr123
para seu Registro de Contêiner do Azure, certifique-se de atualizar o parâmetro--container-image-name
adequadamente.Os parâmetros
--assign-identity
,--role
e--scope
habilitam a identidade gerenciada atribuída pelo sistema no aplicativo Web e atribuem a ela aAcrPull
função no grupo de recursos. Isso dá à identidade gerenciada permissão para efetuar pull de imagens de qualquer Registro de Contêiner do Azure no grupo de recursos.Os parâmetros
--acr-use-identity
e--acr-identity
configuram o aplicativo Web para usar sua identidade gerenciada atribuída pelo sistema para extrair imagens do Registro de Contêiner do Azure.Pode levar alguns minutos para que o aplicativo Web seja criado. Você pode verificar os logs de implantação com o comando az webapp log tail. Por exemplo,
az webapp log tail --resource-group web-app-simple-rg --name webappsimple123
. Se você vir entradas com "warmup", o contêiner está sendo implantado.A URL do aplicativo Web é
<web-app-name>.azurewebsites.net
, por exemplo,https://webappsimple123.azurewebsites.net
.
Faça atualizações e reimplante
Depois de fazer alterações de código, você pode reimplantar no Serviço de Aplicativo com os comandos az acr build e az webapp update.
Limpar
Todos os recursos do Azure criados neste tutorial estão no mesmo grupo de recursos. Remover o grupo de recursos também remove todos os recursos do grupo de recursos e é a maneira mais rápida de remover todos os recursos do Azure usados para seu aplicativo.
Para remover recursos, use o comando az group delete.
az group delete --name web-app-simple-rg
Você também pode remover o grupo no portal do Azure ou no Visual Studio Code e na Extensão de Ferramentas do Azure.
Próximas etapas
Para saber mais, consulte os recursos a seguir: