Docker + Django
Allisson Azevedo
Allisson Azevedo
•

Desenvolvedor Web na SodaVirtual

•

http://github.com/allisson

•

http://youtube.com/allissonazevedo

•

http://slideshare.net/allisson

•

http://speakerdeck.com/allisson
O Problema

•

Preciso rodar meu webapp
•

Preciso de um ambiente pré configurado
•

Minha equipe também
Solução #1

•

Arquivo README no repositório
•

Dependências para instalar no SO

•

Alguns possíveis “truques” para o webapp funcionar
Problemas #1

•

Diferentes SO

•

Diferentes versões do mesmo SO

•

Obriga toda a equipe a ser “especialista” em infra

•

Tempo
Solução #2

•

Virtualização
•

Vagrant
•

Vagrantfile no repo do projeto

•

vagrant up
Problemas #2
•

Vagrant é legal, mas…
•

Não serve para produção
•
•

•

Alto custo de hardware
Uma vm para cada aplicativo :(

É necessário um SO completo para rodar sua
aplicação?
Linux Containers (LXC)

•

Permite rodar um Linux dentro de outro Linux

•

Chroot on steroids

•

Dentro do container, parece uma VM

•

Fora do container, é mais um processo do SO
Porque usar Containers?
•

Velocidade
•

•

Boot em questão de segundos

Economia de recursos
•

Os processos rodando dentro de um container são
vistos como um processo no sistema Host
LXC no Ubuntu 12.04

•

https://help.ubuntu.com/12.04/serverguide/lxc.html
LXC - Quem usa?

•

Heroku

•

dotCloud / Docker INC
Docker
•

Docker is an open-source project to easily create
lightweight, portable, self-sufficient containers from
any application. The same container that a developer
builds and tests on a laptop can run at scale, in
production, on VMs, bare metal, OpenStack clusters,
public clouds and more.

•

Tem como base o LXC
Docker - Filesystem
•

Para rodar um Linux, geralmente precisamos:
•

bootfs - Boot filesystem
•

•

bootloader e kernel

rootfs - Root filesystem
•

restante dos arquivos do sistema
Docker - Filesystem
Docker - Filesystem
Docker - Layers
•

Em um boot tradicional do Linux:
•

•

O kernel monta o rootfs como read-only, checa sua
integridade e faz montagem como read-write

No docker funciona assim:
•

O kernel monta o rootfs como read-only, depois outro
filesystem é montado como read-write em cima do
rootfs

•

Union File System
Docker - Layers
Docker - Images

•

No docker, image é um layer read-only

•

Herança de images

•

Base image: quando não tem pai
Docker - Container

•

É um layer read-write, montado a partir de um image
(e seus parentes)

•

Configuração de rede e limite de recursos
Docker - Container
Docker - Instalação
•

Por enquanto, só funciona no Linux

•

Você pode usar em qualquer sistema, via vagrant

•

git clone https://github.com/dotcloud/docker.git

•

cd docker

•

vagrant up
Demo
Docker + Django
•

Vamos usar algumas ferramentas já utilizadas no
Heroku

•

https://devcenter.heroku.com/articles/getting-startedwith-django

•

dj-database-url

•

dj-static ou o static3 com um middleware wsgi

•

honcho (clone do foreman em python)
Docker + Django
•

git clone https://github.com/allisson/django-dockerexample

•

Dockerfile

•

sudo docker build -t allisson/myblog .

•

sudo docker run -d allisson/myblog

•

sudo docker run -d -e DATABASE_URL=postgres://
user:pass@ip:5432/banco allisson/myblog
Docker - Boas práticas
•

Use repositórios privados quando necessário
•

https://docs.docker.io/en/latest/use/
workingwithrepository/#private-repositories

•

Evitar em produção, containers do tipo: nginx + mysql +
memcached + gunicorn

•

Em produção, o container deve rodar apenas o
processo da aplicação
•

configurações via variáveis de ambiente
Links

•

http://blog.docker.io

•

https://github.com/progrium/dokku

•

http://deis.io

•

https://github.com/shipyard/shipyard
Obrigado!

Docker + Django