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

Este artigo descreve como ir 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 de 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 em todas 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 suportam estruturas da Web Python como Django, Flask e FastAPI.

Cenários de fluxo de trabalho de contêiner

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

Cenário Description Fluxo de trabalho
Desenvolvimento Crie imagens do Python Docker 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 Python Docker.

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íbrida A partir do seu ambiente de desenvolvimento, crie imagens do Python Docker no Azure. Código: código de clone git para ambiente de desenvolvimento (não é necessário para o Docker ser instalado).

Build: 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 Python Docker a partir do repositório GitHub. Código: git clone repositório GitHub para Azure Cloud Shell.

Compilar: no Azure Cloud Shell, use a CLI do Azure ou a CLI do Docker.

Push: Para 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.

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 Description
Aplicativo Web para contêineres Um serviço de hospedagem totalmente gerenciado para aplicativos da Web em contêineres, incluindo sites e APIs da Web. Os aplicativos Web em contêineres no Serviço de Aplicativo do Azure podem ser dimensionados conforme necessário e usar fluxos de trabalho de CI/CD simplificados com o Docker Hub, 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 querem 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, escala e ambientes. Ideal para equipes que desejam começar a criar microsserviços de contêiner sem ter que gerenciar a complexidade subjacente do Kubernetes.

Exemplo: Implantar um aplicativo Web Flask ou FastPI em Aplicativos de Contêiner do Azure.
Azure Container Instances (ACI) Uma oferta sem servidor que fornece um único pod de contêineres isolados do Hyper-V sob demanda. Faturado sobre o consumo em vez de recursos provisionados. Conceitos como escala, balanceamento de carga e certificados não são fornecidos com contêineres ACI. Os usuários muitas vezes interagem com ACI através 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 otimizando.

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.)
Azure Kubernetes Service (AKS) 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 na sua subscrição, com as configurações e operações do cluster sob o seu controlo e responsabilidade. Ideal para equipas que procuram uma versão totalmente gerida do Kubernetes no Azure.

Exemplo: implantar um cluster do Serviço Kubernetes do Azure usando a CLI do Azure.
Funções do Azure Uma solução FAAS (funções como serviço) orientada por 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 equipas que procuram desencadear a execução de funções em eventos; por exemplo, para vincular a outras fontes de dados.

Exemplo: Crie 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 .

Gorjeta

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ê usa ambientes virtuais, não os copie para a imagem do Docker. Use o arquivo .dockerignore para excluí-los.

Você pode pensar nos contêineres do Docker como fornecendo recursos semelhantes aos ambientes virtuais, mas com mais vantagens em reprodutibilidade e portabilidade. O contêiner do Docker pode ser executado em qualquer lugar em que os contêineres possam ser executados, 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 para ser executado. Para chegar a esse ponto, você precisa construir o código do projeto Python em uma imagem do Docker e, em seguida, criar container, uma instância executável dessa imagem.

Para a conteinerização de projetos Python, os principais arquivos são:

Ficheiro de projeto Description
requisitos.txt Usado durante a criação da imagem do Docker para obter as dependências corretas na imagem.
Dockerfile Usado para especificar como construir a imagem do Python Docker. Para obter mais informações, consulte a seção Instruções do Dockerfile para Python.
.dockerignore Os arquivos e diretórios em .dockerignore não são copiados para a imagem do Docker com o COPY comando no Dockerfile. O ficheiro .dockerignore suporta padrões de exclusão semelhantes aos ficheiros .gitignore. Para obter mais informações, consulte Arquivo .dockerignore.

A exclusão de arquivos ajuda no desempenho da criaçã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.

Arquitetura Web Porta
Django 8000
Frasco 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 diferentes.

Solução de contêiner do Azure Como definir a porta do aplicativo Web
Aplicação Web para Contentores Por padrão, o Serviço de Aplicativo assume que seu contêiner personalizado está escutando na porta 80 ou na porta 8080. Se o contêiner escutar uma porta diferente, defina a configuração do aplicativo WEBSITES_PORT 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 seu aplicativo de contêiner à Web pública, à sua rede virtual ou a outros aplicativos de contêiner em seu ambiente, habilitando a entrada. Defina a entrada para a 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 entrada HTTPS ou TCP em Aplicativos de Contêiner do Azure.
Instâncias de contêiner do Azure, Kubernetes do Azure Defina a 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 os 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 Python Dockerfile são mostrados na tabela abaixo.

Instrução Objetivo Exemplo
DE 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
CÓPIA 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, puxe 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 de construção 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ê construirá uma imagem a partir da raiz do seu projeto Python e o caminho para o comando build é "." como mostrado no exemplo a seguir.

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

O processo de compilação pode referir-se 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 Docker. Para obter mais informações, consulte Gerando arquivos do Docker.

O comando de compilação 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 Python Docker

VS Code e PyCharm

Trabalhar em um ambiente de desenvolvimento integrado (IDE) para desenvolvimento de contêineres Python não é necessário, mas pode simplificar muitas tarefas relacionadas a contêineres. 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 o PyCharm, use a CLI do Azure para criar imagens no Azure.)
  • Crie e execute contêineres do Docker a partir de uma imagem existente, 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.

  • (Apenas código VS) Adicione um Dockerfile e o Docker componha 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 ecrã
Etapa 1: Use 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 as instruções.

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, procure a extensão Docker e instale 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ão, expanda imagens e clique com o botão direito do mouse em uma imagem executá-la 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 do 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 Python Docker 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 fino 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 comando a seguir que mostra como usar o comando de execução da CLI do Docker. 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êiner localmente.

Variáveis de ambiente em contêineres

Os 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 na produção, a conexão do banco de dados pode ser alterada para fazer referência a uma instância do 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 build do Docker e o back-end do BuildKit .
  4. Passado como --env ou --env-file argumentos com o comando de execução do Docker.

As duas primeiras opções têm a mesma desvantagem observada acima com arquivos .env , ou seja, que 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 construir imagens 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 Docker run significa que a imagem do Docker não contém as variáveis. No entanto, as variáveis ainda são visíveis inspecionando a instância do contêiner (por exemplo, com a inspeção do contêiner do 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 da 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, você define 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 seu aplicativo como variáveis de ambiente e são acessadas usando o padrão os.environ padrão. Você pode alterar valores após a implantação inicial quando necessário. Para obter mais informações, consulte Configurações do aplicativo do Access 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 das 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 (por exemplo, gerando variáveis de ambiente) entre os serviços de computação e os serviços de suporte de destino no plano de gerenciamento.

Exibindo logs de contêiner

Exiba os logs de instância do 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 visualizar 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 os logs nas janelas do terminal abertas quando a execução do Docker é executada.

  • Se você estiver usando o comando de execução da CLI do Docker com o sinalizador -itinterativo , verá a saída seguindo o comando.

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

Ao implantar um contêiner no Azure, você também tem acesso aos 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
Aplicação Web para Contentores 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 do seu aplicativo sem a necessidade de configuração. Para obter uma visualização em tempo real dos logs, vá para o fluxo de logs de monitoramento - . Para obter consultas de log e configuração mais detalhadas, consulte os outros recursos em Monitoramento.
Azure Container Apps Vá para o recurso de ambiente Diagnosticar e resolver problemas para solucionar problemas de ambiente. Com mais frequência, você desejará ver logs de contêiner. No recurso de contêiner, em Gerenciamento de revisão de aplicativos - , selecione a revisão e, a partir daí, você pode visualizar os logs do sistema e do console. Para obter consultas de log e configuração mais detalhadas, consulte os recursos em Monitoramento.
Azure Container Instances 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
Aplicação Web para Contentores az webapp log
Azure Container Apps az containerapps logs
Azure Container Instances az logs de contêiner

Também há suporte para visualização de logs no VS Code. Você deve ter o Azure Tools for VS Code instalado. 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óximos passos