Visão geral dos aplicativos de contêiner Python no Azure

Este artigo descreve como passar do código do projeto Python (por exemplo, um aplicativo Web) para um contêiner do Docker implantado no Azure. São discutidos o processo geral de conteinerização, as opções de implantação para contêineres no Azure e a configuração específica do Python de contêineres no Azure.

A natureza dos contêineres do Docker é que criar uma imagem do Docker a partir do código e implantar essa imagem em um contêiner no Azure é semelhante entre as linguagens de programação. As considerações específicas da linguagem - Python neste caso - estão na configuração durante o processo de conteinerização no Azure, em particular a estrutura e a configuração do Dockerfile que dão suporte a estruturas da Web do Python, como Django, Flask e FastAPI.

Cenários de fluxo de trabalho de contêiner

Para o desenvolvimento de contêiner Python, alguns fluxos de trabalho típicos para mover de código para contêiner são:

Cenário Descrição Workflow
Dev Crie imagens do Docker Python em seu ambiente de desenvolvimento. Código: código de clone git para ambiente de desenvolvimento (com o Docker instalado).

Build: Use Docker CLI, VS Code (com extensões), PyCharm (com plugin). Descrito na seção Trabalhando com imagens e contêineres do Docker do Python.

Teste: Em ambiente de desenvolvimento em um contêiner do Docker.

Push: para um registro como o Registro de Contêiner do Azure, o Hub do Docker ou o Registro privado.

Implantar: para o serviço do Azure a partir do registro.
Híbridos Em seu ambiente de desenvolvimento, crie imagens do Docker Python no Azure. Código: código de clone git para o ambiente de desenvolvimento (não é necessário para que o Docker seja instalado).

Compilar: VS Code (com extensões), CLI do Azure.

Push: para o Registro de Contêiner do Azure

Implantar: para o serviço do Azure a partir do registro.
Azure Tudo na nuvem; use o Azure Cloud Shell para criar o código de imagens do Docker Python a partir do repositório GitHub. Código: git clone repositório do GitHub para o Azure Cloud Shell.

Compilação: no Azure Cloud Shell, use a CLI do Azure ou a CLI do Docker.

Push: para registro como Registro de Contêiner do Azure, Hub do Docker ou registro privado.

Implantar: para o serviço do Azure a partir do registro.

O objetivo final desses fluxos de trabalho é ter um contêiner em execução em um dos recursos do Azure que dão suporte a contêineres do Docker, conforme listado na próxima seção.

Um ambiente de desenvolvimento pode ser sua estação de trabalho local com Visual Studio Code ou PyCharm, Codespaces (um ambiente de desenvolvimento hospedado na nuvem) ou Visual Studio Dev Containers (um contêiner como um ambiente de desenvolvimento).

Opções de contêiner de implantação no Azure

Os aplicativos de contêiner Python são suportados nos seguintes serviços.

Serviço Descrição
Aplicativo Web para Contêineres Um serviço de hospedagem totalmente gerenciado para aplicativos Web em contêineres, incluindo sites e APIs da Web. Aplicativos Web em contêineres no Serviço de Aplicativo do Azure podem ser dimensionados conforme necessário e usar fluxos de trabalho simplificados de CI/CD com o Hub do Docker, o Registro de Contêiner do Azure e o GitHub. Ideal como uma rampa fácil para os desenvolvedores aproveitarem a plataforma totalmente gerenciada do Serviço de Aplicativo do Azure, mas que também desejam um único artefato implantável contendo um aplicativo e todas as suas dependências.

Exemplo: implantar um aplicativo Web Flask ou FastPI no Serviço de Aplicativo do Azure.
Aplicativos de Contêiner do Azure (ACA) Um serviço de contêiner sem servidor totalmente gerenciado alimentado por Kubernetes e tecnologias de código aberto como Dapr, KEDA e envoy. Baseado nas melhores práticas e otimizado para contêineres de uso geral. A infraestrutura de cluster é gerenciada pelo ACA e o acesso direto à API do Kubernetes não é suportado. Fornece muitos conceitos específicos de aplicativos sobre contêineres, incluindo certificados, revisões, dimensionamento e ambientes. Ideal para equipes que desejam começar a criar microsserviços de contêiner sem precisar gerenciar a complexidade subjacente do Kubernetes.

Exemplo: implantar um aplicativo Web Flask ou FastPI em Aplicativos de Contêiner do Azure.
ACI (Instâncias de Contêiner do Azure) Uma oferta sem servidor que fornece um único pod de contêineres isolados do Hyper-V sob demanda. Cobrado sobre o consumo em vez de recursos provisionados. Conceitos como escala, balanceamento de carga e certificados não são fornecidos com contêineres de ACI. Os usuários frequentemente interagem com a ACI por meio de outros serviços; por exemplo, AKS para orquestração. Ideal se você precisar de um bloco de construção menos "opinativo" que não esteja alinhado com os cenários para os quais os Aplicativos de Contêiner do Azure estão sendo otimizados.

Exemplo: crie uma imagem de contêiner para implantação em Instâncias de Contêiner do Azure. (O tutorial não é específico do Python, mas os conceitos mostrados se aplicam a todas as linguagens.)
AKS (Serviço de Kubernetes do Azure) Uma opção Kubernetes totalmente gerenciada no Azure. Suporta acesso direto à API do Kubernetes e executa qualquer carga de trabalho do Kubernetes. O cluster completo reside em sua assinatura, com as configurações e as operações do cluster dentro de seu controle e responsabilidade. Ideal para equipes que procuram uma versão totalmente gerenciada do Kubernetes no Azure.

Exemplo: implantar um cluster do Serviço Kubernetes do Azure usando a CLI do Azure.
Azure Functions Uma solução FAAS (functions-as-a-service) orientada a eventos e sem servidor. Compartilha muitas características com os Aplicativos de Contêiner do Azure em relação à escala e integração com eventos, mas é otimizado para funções efêmeras implantadas como código ou contêineres. Ideal para equipes que buscam acionar a execução de funções em eventos; por exemplo, para vincular a outras fontes de dados.

Exemplo: Criar uma função no Linux usando um contêiner personalizado.

Para obter uma comparação mais detalhada desses serviços, consulte Comparando aplicativos de contêiner com outras opções de contêiner do Azure.

Ambientes virtuais e contêineres

Quando você está executando um projeto Python em um ambiente de desenvolvimento, usar um ambiente virtual é uma maneira comum de gerenciar dependências e garantir a reprodutibilidade da configuração do projeto. Um ambiente virtual tem um interpretador Python, bibliotecas e scripts instalados que são exigidos pelo código do projeto em execução nesse ambiente. As dependências para projetos Python são gerenciadas por meio do arquivo requirements.txt .

Dica

Com contêineres, os ambientes virtuais não são necessários, a menos que você os esteja usando para testes ou outros motivos. Se você usar ambientes virtuais, não os copie para a imagem do Docker. Use o arquivo .dockerignore para excluí-los.

Você pode pensar que os contêineres do Docker fornecem recursos semelhantes aos ambientes virtuais, mas com vantagens adicionais em reprodutibilidade e portabilidade. O contêiner do Docker pode ser executado em qualquer lugar, independentemente do sistema operacional.

Um contêiner do Docker contém o código do projeto Python e tudo o que o código precisa executar. Para chegar a esse ponto, você precisa compilar o código do projeto Python em uma imagem do Docker e, em seguida, criar contêiner, uma instância executável dessa imagem.

Para conteinerizar projetos Python, os principais arquivos são:

Arquivo de projeto Descrição
requirements.txt Usado durante a criação da imagem do Docker para obter as dependências corretas na imagem.
Dockerfile Usado para especificar como criar a imagem do Docker do Python. Para obter mais informações, consulte a seção Instruções do Dockerfile para Python.
.dockerignore Arquivos e diretórios em .dockerignore não são copiados para a imagem do Docker com o COPY comando no Dockerfile. O arquivo .dockerignore oferece suporte a padrões de exclusão semelhantes aos arquivos .gitignore. Para obter mais informações, consulte Arquivo .dockerignore.

A exclusão de arquivos ajuda no desempenho da compilação da imagem, mas também deve ser usada para evitar a adição de informações confidenciais à imagem onde ela pode ser inspecionada. Por exemplo, o .dockerignore deve conter linhas para ignorar .env e .venv (ambientes virtuais).

Configurações de contêiner para estruturas da Web

As estruturas da Web têm portas padrão nas quais escutam solicitações da Web. Ao trabalhar com algumas soluções de contêiner do Azure, você precisa especificar a porta em que seu contêiner está escutando e que receberá tráfego.

Estrutura Web Porta
Django 8000
Flask 5000 ou 5002
FastAPI (uvicórnio) 8000 ou 80

A tabela a seguir mostra como definir a porta para soluções de contêiner do Azure de diferença.

Solução de contêiner do Azure Como definir a porta do aplicativo Web
Aplicativo Web para Contêineres Por padrão, o Serviço de Aplicativo presume que o contêiner personalizado está escutando na porta 80 ou na porta 8080. Se o contêiner escutar uma porta diferente, defina a configuração WEBSITES_PORT aplicativo no aplicativo do Serviço de Aplicativo. Para obter mais informações, consulte Configurar um contêiner personalizado para o Serviço de Aplicativo do Azure.
Aplicativos de contêineres do Azure Os Aplicativos de Contêiner do Azure permitem que você exponha o aplicativo de contêiner à Web pública, à VNET ou a outros aplicativos de contêiner no ambiente habilitando a entrada. Defina a entrada na porta que seu contêiner escuta para solicitações de entrada targetPort . O ponto de extremidade de entrada do aplicativo é sempre exposto na porta 443. Para obter mais informações, consulte Configurar a entrada HTTPS ou TCP nos Aplicativos de Contêiner do Azure.
Azure Container Instances, Azure Kubernetes Definir porta durante a criação de um contêiner. Você precisa garantir que sua solução tenha uma estrutura web, servidor de aplicativos (por exemplo, gunicorn, uvicorn) e servidor web (por exemplo, nginx). Por exemplo, você pode criar dois contêineres, um contêiner com uma estrutura da Web e um servidor de aplicativos e outra estrutura com um servidor da Web. Os dois contêineres se comunicam em uma porta e o contêiner do servidor Web expõe 80/443 para solicitações externas.

Python Dockerfile

Um Dockerfile é um arquivo de texto que contém instruções para criar uma imagem do Docker. A primeira linha indica a imagem base para começar. Esta linha é seguida por instruções para instalar programas necessários, copiar arquivos e outras instruções para criar um ambiente de trabalho. Por exemplo, alguns exemplos específicos do Python para as principais instruções do Dockerfile do Python são mostrados na tabela abaixo.

Instrução Finalidade Exemplo
FROM Define a imagem base para instruções subsequentes. FROM python:3.8-slim
EXPOR Informa ao Docker que o contêiner escuta nas portas de rede especificadas em tempo de execução. EXPOSE 5000
COPY Copia arquivos ou diretórios da origem especificada e os adiciona ao sistema de arquivos do contêiner no caminho de destino especificado. COPY . /app
CORRER Executa um comando dentro da imagem do Docker. Por exemplo, pull in dependências. O comando é executado uma vez em tempo de compilação. RUN python -m pip install -r requirements.txt
CMD O comando fornece o padrão para executar um contêiner. Só pode haver uma instrução CMD. CMD ["gunicorn", "--bind", "0.0.0.0:5000", "wsgi:app"]

O comando build do Docker cria imagens do Docker a partir de um Dockerfile e de um contexto. O contexto de uma compilação é o conjunto de arquivos localizados no caminho ou URL especificado. Normalmente, você criará uma imagem a partir da raiz do seu projeto Python e o caminho para o comando build é "." conforme mostrado no exemplo a seguir.

docker build --rm --pull  --file "Dockerfile"  --tag "mywebapp:latest"  .

O processo de compilação pode se referir a qualquer um dos arquivos no contexto. Por exemplo, sua compilação pode usar uma instrução COPY para fazer referência a um arquivo no contexto. Aqui está um exemplo de um Dockerfile para um projeto Python usando a estrutura Flask :

FROM python:3.8-slim

EXPOSE 5000

# Keeps Python from generating .pyc files in the container.
ENV PYTHONDONTWRITEBYTECODE=1

# Turns off buffering for easier container logging
ENV PYTHONUNBUFFERED=1

# Install pip requirements.
COPY requirements.txt .
RUN python -m pip install -r requirements.txt

WORKDIR /app
COPY . /app

# Creates a non-root user with an explicit UID and adds permission to access the /app folder.
RUN adduser -u 5678 --disabled-password --gecos "" appuser && chown -R appuser /app
USER appuser

# Provides defaults for an executing container; can be overridden with Docker CLI.
CMD ["gunicorn", "--bind", "0.0.0.0:5000", "wsgi:app"]

Você pode criar um Dockerfile manualmente ou criá-lo automaticamente com o VS Code e a extensão do Docker. Para obter mais informações, consulte Gerando arquivos do Docker.

O comando build do Docker faz parte da CLI do Docker. Quando você usa IDEs como VS Code ou PyCharm, os comandos da interface do usuário para trabalhar com imagens do Docker chamam o comando build para você e automatizam a especificação de opções.

Trabalhando com imagens e contêineres do Docker Python

VS Code e PyCharm

Trabalhar em um ambiente de desenvolvimento integrado (IDE) para desenvolvimento de contêiner Python não é necessário, mas pode simplificar muitas tarefas relacionadas a contêiner. Aqui estão algumas das coisas que você pode fazer com o VS Code e o PyCharm.

  • Baixe e crie imagens do Docker.

    • Crie imagens em seu ambiente de desenvolvimento.
    • Crie imagens do Docker no Azure sem o Docker instalado no ambiente de desenvolvimento. (Para PyCharm, use a CLI do Azure para criar imagens no Azure.)
  • Crie e execute contêineres do Docker a partir de uma imagem existente, de uma imagem extraída ou diretamente de um Dockerfile.

  • Execute aplicativos de vários contêineres com o Docker Compose.

  • Conecte-se e trabalhe com registros de contêiner como Docker Hub, GitLab, JetBrains Space, Docker V2 e outros registros do Docker auto-hospedados.

  • (Somente VS Code) Adicione um Dockerfile e Docker compose arquivos que são adaptados para seu projeto Python.

Para configurar o VS Code e o PyCharm para executar contêineres do Docker em seu ambiente de desenvolvimento, use as etapas a seguir.

Se ainda não o fez, instale as Ferramentas do Azure para VS Code.

Instruções Captura de tela
Etapa 1: Use o SHIFT + ALT + A para abrir a extensão do Azure e confirmar que você está conectado ao Azure.

Você também pode selecionar o ícone do Azure na barra de extensões do VS Code.

Se você não estiver conectado, selecione Entrar no Azure e siga os prompts.

Se você tiver problemas para acessar sua assinatura do Azure, pode ser porque você está atrás de um proxy. Para resolver problemas de conexão, consulte Conexões de rede no Visual Studio Code.
Screenshot showing how Azure Tools looks once signed in.Screenshot showing how Azure Tools looks if you aren't signed in.
Etapa 2: Use CTRL + SHIFT + X para abrir Extensões, procurar a extensão do Docker e instalar a extensão.

Você também pode selecionar o ícone Extensões na barra de extensões do VS Code.
Screenshot showing how to add Docker extension to VS Code.
Etapa 3: selecione o ícone do Docker na barra de extensões, expanda imagens e clique com o botão direito do mouse em uma imagem executada como um contêiner. Screenshot showing how to use the Docker extension in VS Code to run a container from a Docker image.
Etapa 4: Monitore a saída de execução do Docker na janela Terminal. Screenshot showing an example of running a container in VS Code.

CLI do Azure e CLI do Docker

Você também pode trabalhar com imagens e contêineres do Docker Python usando a CLI do Azure e a CLI do Docker. Tanto o VS Code quanto o PyCharm têm terminais onde você pode executar essas CLIs.

Use uma CLI quando quiser um controle mais preciso sobre argumentos de compilação e execução e para automação. Por exemplo, o comando a seguir mostra como usar a compilação az acr da CLI do Azure para especificar o nome da imagem do Docker.

az acr build --registry <registry-name> \
  --resource-group <resource-group> \
  --target pythoncontainerwebapp:latest .

Como outro exemplo, considere o seguinte comando que mostra como usar o comando Docker CLI run . O exemplo mostra como executar um contêiner do Docker que se comunica com uma instância do MongoDB em seu ambiente de desenvolvimento, fora do contêiner. Os diferentes valores para concluir o comando são mais fáceis de automatizar quando especificados em uma linha de comando.

docker run --rm -it \
  --publish <port>:<port> --publish 27017:27017 \
  --add-host mongoservice:<your-server-IP-address> \
  --env CONNECTION_STRING=mongodb://mongoservice:27017 \
  --env DB_NAME=<database-name> \
  --env COLLECTION_NAME=<collection-name> \
  containermongo:latest  

Para obter mais informações sobre esse cenário, consulte Criar e testar um aplicativo Web Python em contêineres localmente.

Variáveis de ambiente em contêineres

Projetos Python geralmente fazem uso de variáveis de ambiente para passar dados para o código. Por exemplo, você pode especificar informações de conexão de banco de dados em uma variável de ambiente para que elas possam ser facilmente alteradas durante o teste. Ou, ao implantar o projeto em produção, a conexão de banco de dados pode ser alterada para se referir a uma instância de banco de dados de produção.

Pacotes como python-dotenv são frequentemente usados para ler pares chave-valor de um arquivo .env e defini-los como variáveis de ambiente. Um arquivo .env é útil ao ser executado em um ambiente virtual, mas não é recomendado ao trabalhar com contêineres. Não copie o arquivo .env para a imagem do Docker, especialmente se ele contiver informações confidenciais e o contêiner for tornado público. Use o arquivo .dockerignore para excluir arquivos de serem copiados para a imagem do Docker. Para obter mais informações, consulte a seção Ambientes virtuais e contêineres neste artigo.

Você pode passar variáveis de ambiente para contêineres de algumas maneiras:

  1. Definido no Dockerfile como instruções ENV .
  2. Passado como --build-arg argumentos com o comando build do Docker.
  3. Passado como --secret argumentos com o comando de compilação do Docker e o back-end do BuildKit .
  4. Passado como --env ou --env-file argumentos com o comando Docker run .

As duas primeiras opções têm a mesma desvantagem observada acima com os arquivos .env , ou seja, você está codificando informações potencialmente confidenciais em uma imagem do Docker. Você pode inspecionar uma imagem do Docker e ver as variáveis de ambiente, por exemplo, com o comando docker image inspect.

A terceira opção com o BuildKit permite que você passe informações secretas para serem usadas no Dockerfile para criar imagens do docker de uma maneira segura que não acabará armazenada na imagem final.

A quarta opção de passar variáveis de ambiente com o comando run do Docker significa que a imagem do Docker não contém as variáveis. No entanto, as variáveis ainda estão visíveis inspecionando a instância do contêiner (por exemplo, com a inspeção do contêiner docker). Essa opção pode ser aceitável quando o acesso à instância do contêiner é controlado ou em cenários de teste ou desenvolvimento.

Aqui está um exemplo de passagem de variáveis de ambiente usando o comando run da CLI do Docker e usando o --env argumento.

# PORT=8000 for Django and 5000 for Flask
export PORT=<port-number>

docker run --rm -it \
  --publish $PORT:$PORT \
  --env CONNECTION_STRING=<connection-info> \
  --env DB_NAME=<database-name> \
  <dockerimagename:tag>

Se você estiver usando o VS Code ou o PyCharm, as opções de interface do usuário para trabalhar com imagens e contêineres usarão comandos da CLI do Docker como o mostrado acima.

Por fim, especificar variáveis de ambiente ao implantar um contêiner no Azure é diferente de usar variáveis de ambiente em seu ambiente de desenvolvimento. Por exemplo:

  • Para o Aplicativo Web para Contêineres, defina as configurações do aplicativo durante a configuração do Serviço de Aplicativo. Essas configurações estão disponíveis para o código do aplicativo como variáveis de ambiente e podem ser acessadas usando o padrão os.environ. Você pode alterar os valores após a implantação inicial quando necessário. Para obter mais informações, consulte Acessar configurações de aplicativo como variáveis de ambiente.

  • Para Aplicativos de Contêiner do Azure, você configura variáveis de ambiente durante a configuração inicial do aplicativo de contêiner. A modificação subsequente de variáveis de ambiente cria uma revisão do contêiner. Além disso, os Aplicativos de Contêiner do Azure permitem definir segredos no nível do aplicativo e, em seguida, fazer referência a eles em variáveis de ambiente. Para obter mais informações, consulte Gerenciar segredos em aplicativos de contêiner do Azure.

Como outra opção, você pode usar o Service Connector para ajudá-lo a conectar os serviços de computação do Azure a outros serviços de suporte. Esse serviço define as configurações de rede e as informações de conexão (gerando, por exemplo, variáveis de ambiente) entre serviços de computação e serviços de suporte de destino no plano de gerenciamento.

Exibição de logs de contêiner

Exiba logs de instância de contêiner para ver a saída de mensagens de diagnóstico do código e para solucionar problemas no código do contêiner. Aqui estão várias maneiras de exibir logs ao executar um contêiner em seu ambiente de desenvolvimento:

  • Executando um contêiner com VS Code ou PyCharm, como mostrado na seção VS Code e PyCharm, você pode ver logs em janelas de terminal abertas quando a execução do Docker é executada.

  • Se você estiver usando o comando Docker CLI run com o sinalizador -itinterativo, verá a saída após o comando.

  • No Docker Desktop, você também pode exibir logs de um contêiner em execução.

Ao implantar um contêiner no Azure, você também tem acesso a logs de contêiner. Aqui estão vários serviços do Azure e como acessar logs de contêiner no portal do Azure.

Serviço do Azure Como acessar logs no portal do Azure
Aplicativo Web para Contêineres Vá para o recurso Diagnosticar e resolver problemas para exibir logs. O diagnóstico é uma experiência inteligente e interativa para ajudá-lo a solucionar problemas de seu aplicativo sem necessidade de configuração. Para obter uma visualização em tempo real dos logs, vá para o fluxo de log de monitoramento - . Para obter consultas de log e configuração mais detalhadas, consulte os outros recursos em Monitoramento.
Aplicativos de Contêiner do Azure Vá para o recurso de ambiente Diagnosticar e resolver problemas para solucionar problemas de ambiente. Mais frequentemente, você desejará ver logs de contêiner. No recurso de contêiner, em Gerenciamento de revisão de aplicativo - , selecione a revisão e, a partir daí, você pode exibir os logs do sistema e do console. Para obter consultas de log e configuração mais detalhadas, consulte os recursos em Monitoramento.
Instâncias de Contêiner do Azure Vá para o recurso Contêineres e selecione Logs.

Para os mesmos serviços listados acima, aqui estão os comandos da CLI do Azure para acessar logs.

Serviço do Azure Comando da CLI do Azure para acessar logs
Aplicativo Web para Contêineres az webapp log
Aplicativos de Contêiner do Azure az containerapps logs
Instâncias de Contêiner do Azure az container logs

Também há suporte para visualização de logs no VS Code. Você deve ter as Ferramentas do Azure para VS Code instaladas. Abaixo está um exemplo de exibição de logs de aplicativos Web para contêineres (Serviço de Aplicativo) no VS Code.

Screenshot showing how to view logs in VS Code for Web Apps for Containers.

Próximas etapas