Como executar uma aplicação Flask em modo de produção no Docker

DockerBeginner
Pratique Agora

Introdução

O Docker tornou-se uma escolha popular para a implantação de aplicações web, incluindo aplicações baseadas em Flask. Neste tutorial, guiá-lo-emos através do processo de Dockerização de uma aplicação Flask e sua execução em modo de produção utilizando o Docker. No final deste artigo, terá uma compreensão sólida de como aproveitar o Docker para implantar sua aplicação Flask em um ambiente de produção.

Compreendendo o Docker

O Docker é uma plataforma de código aberto popular que permite aos desenvolvedores construir, implantar e executar aplicações em um ambiente containerizado. Ele fornece uma forma de empacotar uma aplicação e todas as suas dependências em um único contêiner, facilitando a movimentação da aplicação entre diferentes ambientes computacionais.

O que é o Docker?

O Docker é uma plataforma de software que permite aos desenvolvedores construir, implantar e executar aplicações em contêineres. Um contêiner é um pacote leve, autônomo e executável que inclui tudo o que é necessário para executar uma aplicação, incluindo o código, o tempo de execução, as ferramentas de sistema e as bibliotecas. Os contêineres são isolados uns dos outros e do sistema operacional hospedeiro, garantindo uma implantação consistente e confiável da aplicação.

Benefícios do Docker

  1. Portabilidade: Os contêineres Docker podem ser executados de forma consistente em diferentes ambientes computacionais, desde o laptop de um desenvolvedor até um servidor de produção, garantindo que a aplicação se comporte da mesma forma, independentemente da infraestrutura subjacente.
  2. Escalabilidade: O Docker facilita a escala de aplicações para cima ou para baixo, dependendo da demanda, adicionando ou removendo contêineres conforme necessário.
  3. Eficiência: Os contêineres Docker são leves e utilizam menos recursos do que as máquinas virtuais tradicionais, permitindo um uso mais eficiente dos recursos computacionais.
  4. Consistência: O Docker garante que a aplicação e suas dependências sejam empacotadas juntas, eliminando o problema "funciona na minha máquina" e garantindo um comportamento consistente em diferentes ambientes.

Arquitetura do Docker

A arquitetura do Docker consiste nos seguintes componentes principais:

graph TD A[Cliente Docker] --> B[Demônio Docker] B --> C[Imagens Docker] B --> D[Contêineres Docker] B --> E[Rede Docker] B --> F[Armazenamento Docker]
  1. Cliente Docker: O cliente Docker é a principal interface de usuário para interagir com o Docker. Ele permite que os usuários emitam comandos para o demônio Docker, como construir, executar e gerenciar contêineres.
  2. Demônio Docker: O demônio Docker é o serviço de backend que gerencia a criação, modificação e remoção de objetos Docker, como imagens, contêineres, redes e volumes.
  3. Imagens Docker: As imagens Docker são os projetos para criar contêineres Docker. Elas contêm o código da aplicação, bibliotecas, dependências e quaisquer outros arquivos necessários para executar a aplicação.
  4. Contêineres Docker: Os contêineres Docker são as instâncias em execução de imagens Docker. São ambientes isolados, leves e portáteis que executam a aplicação.
  5. Rede Docker: O Docker fornece recursos de rede embutidos que permitem que os contêineres se comuniquem entre si e com o mundo externo.
  6. Armazenamento Docker: O Docker fornece várias opções de armazenamento, incluindo volumes e montagens de ligação, para gerenciar os dados persistentes associados a um contêiner.

Compreender a arquitetura do Docker e seus componentes principais é crucial para usar e gerenciar o Docker de forma eficaz em seus processos de desenvolvimento e implantação de aplicações.

Dockerizando uma Aplicação Flask

Nesta seção, aprenderemos como containerizar uma aplicação Flask usando o Docker.

Criando uma Aplicação Flask

Começaremos criando uma aplicação Flask simples. Crie um novo diretório e navegue até ele no seu terminal. Em seguida, crie um novo arquivo chamado app.py com o seguinte conteúdo:

from flask import Flask

app = Flask(__name__)

@app.route('/')
def hello():
    return 'Olá, LabEx!'

if __name__ == '__main__':
    app.run(host='0.0.0.0', port=5000)

Esta aplicação Flask possui uma única rota que retorna a mensagem "Olá, LabEx!".

Dockerizando a Aplicação Flask

Para containerizar a aplicação Flask, precisamos criar um Dockerfile. Crie um novo arquivo chamado Dockerfile com o seguinte conteúdo:

FROM python:3.9-slim

WORKDIR /app

COPY requirements.txt .
RUN pip install --no-cache-dir -r requirements.txt

COPY . .

CMD ["python", "app.py"]

Vamos analisar o Dockerfile:

  1. FROM python:3.9-slim: Isso especifica a imagem base para o contêiner Docker, que neste caso é a versão slim da imagem Python 3.9.
  2. WORKDIR /app: Isso define o diretório de trabalho dentro do contêiner como /app.
  3. COPY requirements.txt .: Isso copia o arquivo requirements.txt para o diretório de trabalho do contêiner.
  4. RUN pip install --no-cache-dir -r requirements.txt: Isso instala as dependências Python especificadas no arquivo requirements.txt.
  5. COPY . .: Isso copia todo o código da aplicação (incluindo app.py) para o diretório de trabalho do contêiner.
  6. CMD ["python", "app.py"]: Isso especifica o comando a ser executado quando o contêiner inicia, que é executar o script app.py usando o interpretador Python.

Construindo e Executando o Contêiner Docker

Agora, vamos construir a imagem Docker e executar o contêiner:

  1. Construa a imagem Docker:
    docker build -t labex-flask-app .
  2. Execute o contêiner Docker:
    docker run -p 5000:5000 labex-flask-app

A opção -p 5000:5000 mapeia a porta 5000 do host para a porta 5000 do contêiner, permitindo que você acesse a aplicação Flask de sua máquina local.

Após executar o contêiner, você pode acessar a aplicação Flask abrindo um navegador web e navegando para http://localhost:5000. Você deverá ver a mensagem "Olá, LabEx!" exibida.

Parabéns! Você containerizou com sucesso uma aplicação Flask usando o Docker.

Executando Aplicação Flask em Modo de Produção

Ao executar uma aplicação Flask em um ambiente de produção, é importante utilizar um servidor pronto para produção em vez do servidor de desenvolvimento embutido. Nesta seção, aprenderemos como executar uma aplicação Flask em modo de produção usando Docker.

Escolhendo um Servidor de Produção

Existem vários servidores web prontos para produção que podem ser usados para executar uma aplicação Flask, como Gunicorn, uWSGI e Waitress. Neste exemplo, usaremos o Gunicorn, um servidor web popular e amplamente utilizado para aplicações Python.

Modificando o Dockerfile

Para executar a aplicação Flask em modo de produção usando Gunicorn, precisamos atualizar o Dockerfile. Substitua o conteúdo do Dockerfile pelo seguinte:

FROM python:3.9-slim

WORKDIR /app

COPY requirements.txt .
RUN pip install --no-cache-dir -r requirements.txt

COPY . .

RUN pip install gunicorn

CMD ["gunicorn", "--bind", "0.0.0.0:5000", "app:app"]

As principais mudanças são:

  1. Adicionamos RUN pip install gunicorn para instalar o servidor web Gunicorn.
  2. Alteramos a instrução CMD para usar o Gunicorn para iniciar a aplicação Flask. O comando "gunicorn", "--bind", "0.0.0.0:5000", "app:app" instrui o Gunicorn a vincular a aplicação ao endereço 0.0.0.0:5000 e usar o objeto app do arquivo app.py como a aplicação WSGI.

Construindo e Executando o Contêiner Docker Pronto para Produção

Agora, vamos construir a imagem Docker e executar o contêiner em modo de produção:

  1. Construa a imagem Docker:
    docker build -t labex-flask-app-prod .
  2. Execute o contêiner Docker:
    docker run -p 5000:5000 labex-flask-app-prod

A aplicação agora deve estar rodando em modo de produção usando o Gunicorn.

Verificando a Configuração de Produção

Para verificar se a aplicação Flask está rodando em modo de produção, você pode usar o seguinte comando para verificar os logs:

docker logs <container_id>

Você deve ver uma saída semelhante à seguinte:

[2023-04-11 12:34:56 +0000] [1] [INFO] Starting gunicorn 20.1.0
[2023-04-11 12:34:56 +0000] [1] [INFO] Listening at: http://0.0.0.0:5000 (1)
[2023-04-11 12:34:56 +0000] [1] [INFO] Using worker: sync
[2023-04-11 12:34:56 +0000] [8] [INFO] Booting worker with pid: 8

Isso confirma que a aplicação Flask está rodando em modo de produção usando o servidor web Gunicorn.

Resumo

Este tutorial cobriu os passos essenciais para executar uma aplicação Flask em modo de produção usando Docker. Explorámos o processo de containerização de uma aplicação Flask, incluindo a criação de um Dockerfile e a construção da imagem Docker. Além disso, discutimos como executar a aplicação Flask em modo de produção dentro do contêiner Docker, garantindo um deploy confiável e escalável. Seguindo as práticas descritas neste guia, pode utilizar eficazmente o Docker para implantar suas aplicações web baseadas em Flask em um ambiente de produção.