← Back to blog

Containerize uma aplicação Python usando Docker

Category
Containerize uma aplicação Python usando Docker

Docker é uma solução gratuita e de código aberto para desenvolver, implantar e gerenciar aplicações com virtualização leve em nível de sistema operacional. Neste guia, demonstraremos como criar uma aplicação Python dentro de um contêiner Docker.

Pré-requisitos

Para realizar as etapas demonstradas neste guia, você precisará dos seguintes componentes:

Contêineres Docker

Ao executar vários programas dentro do mesmo ambiente, as coisas podem — e vão — quebrar. Quanto mais programas você adiciona, mais instável o ambiente se torna. Isso pode não ser um grande problema para usuários comuns. No entanto, quando se trata de aplicações críticas, as consequências podem ser sérias.

Quanto mais aplicações são introduzidas no sistema, maior é a superfície de ataque. Uma única aplicação comprometida pode facilmente levar ao comprometimento de todo o sistema.

Para resolver esses problemas, podemos usar contêineres Docker para isolamento em nível de software:

  • As aplicações dentro do contêiner terão acesso limitado aos arquivos.

  • Aplicações conteinerizadas não conseguem ver outros processos em execução no sistema.

  • O contêiner pode receber uma quantidade específica de recursos de hardware.

  • As portas de rede de um contêiner não ficam expostas externamente.

  • Empacotamento consistente de praticamente qualquer coisa entre ambientes locais e de produção.

Para demonstrar, criaremos um servidor Python simples dentro de um contêiner Docker, transformaremos o contêiner em uma imagem e implantaremos a imagem em um ambiente de produção fictício.

Etapa 1 – Configuração do sistema de arquivos

Para hospedar o projeto, primeiro criaremos um diretório dedicado:

mkdir -pv python-server-container/
cd python-server-container/

Dentro do diretório, crie um subdiretório src para armazenar nosso código:

mkdir -pv src/

Etapa 2 – Construindo o servidor Python

Nesta etapa, criaremos um servidor HTTP simples em Python. Crie o arquivo server.py:

touch server.py

Abra-o em um editor de texto:

nano server.py

Insira o seguinte código Python:

from http.server import HTTPServer, SimpleHTTPRequestHandler

def run(server_class=HTTPServer, handler_class=SimpleHTTPRequestHandler):
    """server entrypoint"""
    server_address = ("0.0.0.0", 8080)
    httpd = server_class(server_address, handler_class)
    print("starting server...")
    httpd.serve_forever()

if __name__ == "__main__":
    run()

Aqui:

  • Estamos usando a classe HTTPServer e solicitando um manipulador da biblioteca padrão do Python, mantendo o programa simples.

  • A função run inicia uma instância de HTTPserver.

  • Como os argumentos de server_address sugerem, o servidor escutará qualquer conexão de entrada na porta 8080.

Agora, verificaremos se o servidor está funcionando conforme esperado. Inicie o servidor:

python3 server.py

Em um novo terminal, podemos usar curl para enviar uma solicitação ao servidor:

curl -iv localhost:8080

Como alternativa, você pode acessar o link em um navegador web:

http://localhost:8080

Etapa 3 – Criando um Dockerfile

Um Dockerfile contém as instruções necessárias para gerar uma imagem Docker. As instruções no arquivo são executadas sequencialmente. Saiba mais sobre Dockerfile.

Crie um novo Dockerfile para nosso projeto:

touch Dockerfile

Agora, adicionaremos os códigos necessários nele. Abra-o em um editor de texto:

nano Dockerfile

Insira o seguinte código:

FROM python:latest

ENV SRC_DIR /usr/bin/src/test_server/src
COPY src/* ${SRC_DIR}/
WORKDIR ${SRC_DIR}

ENV PYTHONUNBUFFERED=1

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

Aqui:

  • Qualquer Dockerfile deve começar com a diretiva FROM. No nosso caso, declaramos Python como a base da imagem Docker.

  • A diretiva ENV SRC_DIR especifica a localização do diretório do contêiner.

  • A diretiva COPY copia os arquivos do diretório src, que atualmente hospeda o servidor Python.

  • A variável PYTHONBUFFERED=1 especifica que o Python imprimirá e registrará a saída diretamente em STDOUT. Caso contrário, os logs não seriam enviados a nenhum buffer.

  • A diretiva CMD especifica um comando padrão a ser executado ao iniciar o contêiner. Neste caso, usamos a diretiva para iniciar nosso servidor Python.

Etapa 4 – Geração da imagem Docker

Com o Dockerfile pronto, agora podemos criar uma imagem. Execute o seguinte comando Docker para iniciar o processo:

docker build . -t python_server

Aqui:

  • A flag -t é usada para marcar nossa imagem Docker como python_server.

  • O Docker baixará todos os componentes necessários e os combinará em uma imagem.

Etapa 5 – Executando a imagem

A imagem está pronta para implantação. Podemos executá-la usando o seguinte comando:

docker run -p 8080:8080 python_server

Aqui, estamos encaminhando a porta 8080 da máquina local para a imagem Docker usando a flag -p.

Podemos validar facilmente se o servidor está em execução usando curl:

curl -iv localhost:8080

Etapa 6 – Encerrando o servidor

No terminal, pressione “Ctrl + C” para encerrar o processo Docker:

Etapa 7 – Exportando e importando a imagem Docker

Agora temos uma imagem Docker funcional hospedando nosso servidor Python. Com a ajuda dos recursos de exportação e importação do Docker, podemos migrá-la para qualquer outro sistema.

Primeiro, verifique a lista de imagens Docker no sistema atual:

docker images

Nosso alvo é a imagem Docker python_server que acabamos de criar. O comando a seguir a exportará como um arquivo TAR:

docker save python_server:latest > python_server.tar

Depois de transferir o arquivo python_server.tar para a máquina de destino, use o seguinte comando para importar a imagem Docker:

docker load < python_server.tar

Considerações finais

Neste guia, demonstramos como criar uma imagem Docker a partir de uma aplicação Python. Criamos um servidor web Python simples e construímos uma imagem Docker a partir dele. A imagem Docker agora pode ser implantada em qualquer ambiente, mantendo um comportamento consistente.

Tem interesse em aprender mais sobre Docker? Confira os seguintes guias:

Boa computação!

Preslav Dobrev

Autor · CloudSigma

Comentários

Nenhum comentário ainda. Seja o primeiro.