Docker para Pythonistas
Felipe Pontes
@felipemfp
O que essa palestra é
Introdução ao Docker
Como usar com Python
Exemplos com Flask e Django
O que essa palestra não é
Aula completa de Docker
Melhores práticas para implatação
Docker
O que a gente ouve falar?
Máquinas Virtuais
O que são?
Como funciona uma VM?
E um container?
Adoção ao Docker
- Fácil de usar
- Rápido
- Docker Hub ❤️
- Modularidade
- Escalabilidade
O ecossistema
Docker Client
docker build -t grupy-rn:4 .
docker run grupy-rn:4
docker pull grupy-rn
docker ps
Docker Daemon
Dockerfile
# Usa imagem oficial como imagem pai
FROM python:3
# Configura diretório padrão de trabalho
WORKDIR /usr/src/app
# Copia o arquivo com dependências e instala
COPY requirements.txt ./
RUN pip install -r requirements.txt
# Copia o projeto
COPY . .
# Executa grupy-rn.py quando iniciar
CMD [ "python", "./grupy-rn.py" ]
Docker Image
Volumes
Docker Container
Dockerizando aplicação Flask
https://github.com/felipemfp/dockerized-flask
app.py
from flask import Flask, request, jsonify
app = Flask(__name__)
@app.route('/imc')
def imc():
args = request.args
height = args.get('height', 0)
weight = args.get('weight', 0)
if height == 0 or weight == 0:
return jsonify(
success=False,
message='You should provide height (cm) and weight (kg).'
), 400
imc = float(weight) / ((float(height) / 100) ** 2)
return jsonify(success=True, data=imc)
Dockerfile
FROM python:3
ENV FLASK_APP app.py
WORKDIR /usr/src/app
COPY . /usr/src/app
RUN pip install flask
EXPOSE 5000
ENTRYPOINT [ "flask" ]
CMD [ "run", "--host=0.0.0.0" ]
Construindo...
Executando...
... em segundo plano
O que acontece sem -p?
E como para?
Dockerizando aplicação Django
https://github.com/felipemfp/dockerized-django
Um projeto Django
.
├── docker-compose.yml
├── Dockerfile
├── dockerizeddjango
│ ├── __init__.py
│ ├── settings.py
│ ├── urls.py
│ └── wsgi.py
├── LICENSE
├── manage.py
├── Pipfile
├── Pipfile.lock
└── README.md
Docker Compose
Dockerfile
FROM python:3
WORKDIR /usr/src/app
COPY Pipfile ./
COPY Pipfile.lock ./
RUN pip install pipenv
RUN pipenv install --system --dev
docker-compose.yml
version: '3'
services:
db:
image: postgres:alpine
volumes:
- ./.docker/volumes/db:/var/lib/postgresql/data
web:
build: .
environment:
- DEBUG=true
- DATABASE_URL=postgresql://postgres:postgres@db:5432/postgres
command: python manage.py runserver 0.0.0.0:8000
volumes:
- .:/usr/src/app
ports:
- "8000:8000"
depends_on:
- db
Variáveis de ambiente
settings.py
# settings.py
import dj_database_url
from decouple import config
# ...
DEBUG = config('DEBUG', cast=bool, default=False)
# ...
DATABASES = {
'default': dj_database_url.parse(
config(
'DATABASE_URL',
default='sqlite:///' + os.path.join(BASE_DIR, 'db.sqlite3')
),
)
}
Rodando o projeto...
... em segundo plano
Como executar manage.py?
Parando o projeto...
Perguntas?
Obrigado!
https://felipemfp.github.io
Docker para Pythonistas
By Felipe Pontes
Docker para Pythonistas
Aplicando Docker no dia a dia do desenvolvimento com Python
- 1,347