O pai ta on!!
Em nosso último post falamos sobre o Dockerfile, e apresentamos um exemplo de suas funcionalidades. Hoje aprenderemos como criar o build do arquivo, já com uma aplicação CRUD em pleno funcionamento.
Para isso utilizaremos a base de um CRUD de cadastro de clientes em python e flask criado pelo Moises Abraão, e contemplaremos no Dockerfile os passos:
1. Fazer o upgrade dos pacotes do SO;
2. Instalar os requisitos para a aplicação (banco, python e flask);
3. Copiar os arquivos do github para dentro do container;
4. Configurar a aplicação com os parâmetros necessários;
5. Efetuar o deploy da aplicação;
Processo de build do Dockerfile
Fonte: Clique aqui
Para iniciar o processo do build, copie as informações abaixo, e salve em um arquivo chamado Dockerfile.
FROM ubuntu:latest
#define o responsável pela aplicação
LABEL maintainer=”Thiago Marques”
#Atualiza o SO
RUN apt-get update && apt-get upgrade -y
#Instala o python3, pip3 e o git
RUN apt-get install python3 python3-pip git -y
#clona o APP
RUN git clone https://github.com/thiagosagara/CRUD-FLASK-PYTHON.git /opt/CRUD-FLASK-PYTHON/
#vai para o diretório principal
WORKDIR /opt/CRUD-FLASK-PYTHON/
#Instala o aplicativo
RUN pip3 install -r requirements.txt
RUN python3 -m flask db init && python3 -m flask db migrate && python3 -m flask db upgrade
#Expoe a porta 80 (apenas para documentação)
EXPOSE 80
# Entra na pasta do app (só é executado quando iniciamos o container)
CMD [“python3”, “wsgi.py”]
Após salvar o arquivo iniciarmos o processo do build, com o comando:
docker build -t thiagosagara/myapp:1.0 .
Nesse comando usamos a opção ‘-t’ para definir a tag, que seria basicamente a versão da aplicação. Nesse caso 1.0.
Note que também existe um ponto (.) no final do comando, que referência o diretório onde o build será efetuado. O build procura o arquivo Dockerfile, caso ele tenha outro nome e/ou não está na mesma pasta, você pode usar a opção ‘-f’ e indicar o diretório.
Após a execução do comando para cada instrução será gerado um passo (step):
Após o término do build, será provisionado no repositório local a nova imagem:
Com isso vamos agora criar um container com essa imagem. Note que quando criamos a instrução de CMD que existe no Dockerfile aparece no ‘COMMAND’ do container, ou seja, vai ser o comando que vai iniciar quando criamos o container. Nesse caso usamos para iniciar a aplicação, mas poderia ser simplesmente um ‘/bin/bash’.
Após subir o container podemos visualizar os logs com o comando docker logs
Abaixo os screenshots da aplicação:
Boas práticas no Dockerfile
É importante notar que ao criar uma imagem com tudo que você precisa, é possível deixá-la grande, e onerar o processo de atualização da aplicação. Lembre-se sempre que a ideia de usar container é justamente para garantir a utilização dos recursos de forma mais eficiente. Se você vai utilizá-lo para criar um monolito em container, talvez não faça tanto sentido.
Assim existe algumas boas práticas que devem ser observadas, como:
1. Crie containers efêmeros.
• Você precisa garantir que pode parar, destruir e reconstruir um container com o mínimo de setup possível.
2. Entenda o processo que sua aplicação faz antes de construir uma imagem;
• Anote o ‘passo-a-passo’ do que você precisa fazer para a aplicação estar disponível depois que sobe a base do container. O que normalmente faço, é subir um container sem nada, e ir instalando o que preciso até estar da forma que quero. Depois, analiso o history da máquina e coleto os comandos que utilizei para criar o dockerfile.
3. Não instale pacotes desnecessários;
• Nem todo pago que você considera legal pode ser interessante instalar. Cada pacote instalado aumenta a complexidade e tamanho da imagem final.
4. Desacople o máximo possível a aplicação;
• Deixe o container mais próximo de um microserviço, isso vai te ajudar em desde esteiras de desenvolvimento a upgrades da aplicação de forma segmentada (lembre-se que o próprio docker segmentou os runtimes para facilitar as coisas);
5. Minimize a quantidade de layers(steps) do build;
• Não precisa criar um RUN para cada yum install que você precisa na aplicação.
A dica aqui é, use o RUN com documentação de cada estágio, por exemplo: um RUN para atualizar o SO, um para instalar os programas e um para o deploy da aplicação.
Veja os outros artigos sobre Docker!
Entendendo Docker
Docker Compose – Gerenciamento e deploy de imagens
Arquitetura Docker
O que é DockerFile?
That’s all folks! Be Happy!!!