Preparando um ambiente Docker para desenvolvimento em Flask

Construindo a estrutura mínima do projeto

Vamos construir a estrutura mínima para um projeto python com Flask

Crie a pasta do seu projeto

1
2
mkdir ./formula_magica_app
cd ./formula_magica_app

Crie um Ambiente virtual Python para seu projeto.

1
2
python3.6 -m venv venv
source venv/bin/activate

Não precisa criar o Ambiente virtual para um projeto em Docker. Eu apenas o Faço para facilitar o pip freeze

Neste ponto gosto de criar o arquivo base de requisitos do Python já com a dependência do Flask instalada

1
2
3
pip install flask
pip install gevent
pip freeze >requirements.txt

Sobre o Flask

Para projetos rápidos e de aprendizado gosto de usar o Framework Flask devido a sua facilidade de uso e por ser “direta e reta”.

É um pacote extremamente leve para rodar, sem uma estrutura de diretório complexa e ao mesmo tempo possui muitas extensões e uma comunidade forte.

Outra framework muito utilizada é o Django e confesso que para um projeto bem delimitado ele oferece ferramentas melhores integradas a framework, já vem com um painel admin, bibliotecas para bancos de dados, uma estrutura pré-definida de diretório. Mas a simplicidade é exatamente a beleza do Flask, a comunidade diz que o Flask é uma framework “unopinionated”, ou seja, ele te permite decidir como implementar sua aplicação sem ficar no meio do caminho.

Existem diversas outras Web Frameworks para python e você pode conferi-las aqui.

Criando os arquivos iniciais do Projeto

Vamos criar um arquivo de configuração para a nossa aplicação na pasta do projeto já com classes que representam ambientes de produção e desenvolvimento.

./config.py
1
2
3
4
5
6
7
8
class Config(object): 
pass

class ProdConfig(Config):
pass

class DevConfig(Config):
DEBUG = True

E agora o arquivo da aplicação.

./main.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
from gevent.pywsgi import WSGIServer
from flask import Flask
from config import DevConfig

app = Flask(__name__)
app.config.from_object(DevConfig)

@app.route('/')
def home():
return '<h1>Olá mundo pequeno!</h1>'

if __name__ == '__main__':
http_server = WSGIServer(('', 5000), app)
http_server.serve_forever()

Já já vamos colocar esse código para rodar, aguenta aí.

Configurando o Docker

Crie um Dockerfile na pasta do projeto

./Dockerfile
1
2
3
4
5
6
7
8
9
10
11
12
13
14
FROM python:3.6.5
# Criando uma pasta para a aplicação
WORKDIR /app

# Copiando arquivos da pasta local para dentro do Docker
ADD . /app

# Instalando as dependências dentro do Docker
RUN pip install -r requirements.txt

EXPOSE 5000

#Rodando a aplicação
CMD ["python", "main.py"]

Nesta altura do campeonato, sua estrutura de diretório deve ser assim:

upload successful

Por que Docker?

Nossa aplicação precisará rodar a aplicação Web, mas não para por ai. No fim deste artigo também precisaremos de um sistema de banco de dados, de um sistema de autenticação e projetos reais muitas vezes rodam mais de um servidor web, enfim, você pegou a idéia.

Dado essa pilha (“stack”) de aplicações, uma forma simples de defini-lá e executá-la e através de sistemas de containers. E é ai que o Docker entra na jogada.

Com o Docker, você define como instalar sua aplicação e depois pode facilmente compartilhar o script com seu time e até mesmo subir para produção de forma rápida e ligeira.

Rodando a Aplicação

Bora colocar a aplicação para rodar.

Construa sua imagem do Docker

1
docker build -t formula_magica .

Rode o container

1
docker run --name fm -p 5000:5000 formula_magica 

Agora só acessar sua aplicação em: http://localhost:5000

Diquinha para facilitar o Docker Build

Depois de rodar várias e várias vezes o comando, tu notará que o docker build reinstala toda vez os requirements.txt do pip.

Para evitar isso eu gero uma tag local após saber que não modificarei mais o requirements.txt

1
docker tag formula_magica local/formula_magica

E modifico o Dockerfile para isso

./Dockerfile
1
2
3
4
5
6
7
8
9
10
11
12
13
14
FROM local/formula_magica
# Criando uma pasta para a aplicação
WORKDIR /app

# Copiando arquivos da pasta local para dentro do Docker
ADD . /app

# Instalando as dependências dentro do Docker
RUN pip install -r requirements.txt

EXPOSE 5000

#Rodando a aplicação
CMD ["python", "main.py"]

Facilita muito o serviço!