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

Made with Slides.com