Docker na Vida Real
Fernando Ike
Fernando Ike
Clientes Latam
Arquitetura anterior
Incidente
"Day 12 Occupy Wall Street September 28 2011 Shankbone 17" by David Shankbone - Eget arbejde. Licensed under Creative Commons Attribution 3.0 via Wikimedia Commons"
"Stamps of Russia 2012 No 1559-61 Mascots 2014 Winter Olympics" by Russian Post, Publishing and Trade Centre "Marka" (ИТЦ «Марка»). The design of the souvenir sheet by O. Shushlebina. Scanned
by Dmitry Ivanov. - From a personal collection.. Licensed under Public domain
https://scottlinux.com/2013/04/06/wso-web-shell-php-shell-used-by-hackers/
Incidente
● Plugin Askimet PHP
● PHP Web Shell
● Injeção de páginas web
Rebuilding...
Premissas
Premissas / Requisitos
● Isolamento dos sites/aplicações
● Facilidade de manutenção e
migração
● Facilidade de gerar
documentação
● Portável
Isolamento
Fonte: http://www.itdestination.com/training/courses/adv-linux/
Isolamento / VMs
● Boa documentação
● 1 VM por site/aplicação
● Aumento da complexidade
● Orquestração - Chef, Puppet, etc
● Muito conhecidos
● Custo maior total
● Fácil de documentar
Isolamento / Containers
● Chroot turbinado
● Configuração mais complexa
● +- conhecidos
● VServer não suportado no IaaS
contratado
● Relativamente fácil de documentar
Isolamento / Containers
● Chroot turbinado
● Custo baixo
● Fácil de configurar
● Conhecidos
● Fácil de documentar
● Fácil manutenção
Escolhido...
VMs
Linode
1 VM = $ 10
8 VMs
$ 960/year
https://www.flickr.com/photos/editor/6698208975
https://www.flickr.com/photos/bitzcelt/2516437322
Containers
1 VM
8 containers
$ 120/year
https://www.flickr.com/photos/kalexanderson/6012209875
Docker: Overview
● Criado em 2013
● Baseado no LXC
● Versionamento de container
● Histórico de mudança
● Like Git ($docker {commit, pull, request, diff, tag})
● Docker Hub
● Disruptivo/Revolucionário
Ecossistema
Instalando...
● Debian
○ #aptitude install docker.io
● Ubuntu
○ #apt-get install docker.io
FROM php:5.6-apache
COPY package /srv/www/app
ADD app_apache.conf /etc/apache2/sites-enable/app.conf
WORKDIR /srv/www/app
CMD [ “/usr/sbin/apache2", "-D", “FOREGROUND” ]
Dockerfile
Building and running
$docker build --rm --no-cache -t=”app1” .
#docker run -d -p 80:80 app1
$docker run -it php:5.6-apache /bin/bash
$docker run -it ruby:2.2 irb
$docker run -it python:3.4 python
$xhost +
$docker run --privileged -v /tmp/.X11-unix:/tmp/.X11-unix -v 
/home/fike/d:/d -v /var/log/atom:/var/log/atom 
-e DISPLAY=unix$DISPLAY jess/atom
Rebuilding...
http://www.geograph.org.uk/photo/3263456
Nova arquitetura
Rebuilding...
Serviços vs Aplicações
Serviços
● Apache/Nginx
● Postgres/MySQL/MongoDB/Memcache
● Rails/Django/Symfony/JBoss
● Ubuntu/Debian/CentOS
● Nginx/Varnish/HAProxy
Aplicações
● Site1 (Apache+ Nginx + PHP+Symfony
● Site2 (Apache+ Nginx + PHP+Symfony)
● App1 (Jboss+MySQL+Rabbimq)
● App2 (Django, Unicorn, Cassandra)
● App3 (Wordpress)
● App3 (Drupal)
Dependências
Dependências (bibliotecas)
Pacotes .deb, .rpm, etc.
● Dependências controladas pela SO
● "Versões" empacotadas
● Atualizações de Segurança pelo SO
● Controlado pelo SO
● Atualização das versões das bibliotecas + complexas
Dependências (bibliotecas)
Composer/PIP/Gems/CPAN, etc...
● Dependências controladas pela "aplicação"
● "Independente" de SO
● "User friendly" para desenvolvedores
● Fácil gerenciamento das “versões” das bibliotecas
https://www.flickr.com/photos/clonedmilkmen/3604999084/in/photostream/
Docker e Rede
● Iptables
● Bridge
● 172.17.XXX.XXX/16
● Rede entre containers: override /etc/hosts
● Usar o IP de outro container
Docker e Rede
$docker run -d -p 9999:9999 app1
$docker run -d -p 9999:9999/udp -p 9999:9999 app1
$docker run [...] --name docker [...] --link database:mysql app1
$docker run [...] --net="container:CONTAINERID" app2
Docker e Rede
[...]
Chain FORWARD (policy ACCEPT)
target prot opt source destination
ACCEPT tcp -- 0.0.0.0/0 172.17.0.83 tcp dpt:80
ACCEPT tcp -- 0.0.0.0/0 172.17.0.83 tcp dpt:25
ACCEPT udp -- 0.0.0.0/0 172.17.0.73 udp dpt:53
ACCEPT tcp -- 0.0.0.0/0 172.17.0.73 tcp dpt:53
ACCEPT tcp -- 172.17.0.2 172.17.0.6 tcp spt:5432
ACCEPT tcp -- 172.17.0.6 172.17.0.2 tcp dpt:5432
[...]
Localização - Idioma
[…]
RUN echo "locales locales/locales_to_be_generated multiselect pt_BR.UTF-8 UTF-8" | debconf-
set-selections &&
echo "locales locales/default_environment_locale select pt_BR.UTF-8" | debconf-set-
selections
RUN apt-get install locales -qq
ENV LC_ALL pt_BR.UTF-8
[...]
Segurança
Segurança
● Hardening
● Filesystem bind
● SELinux, Apparmor, Etc..
● Volumes
● Usuários
http://www.pcworld.com/article/2825032/linux-botnet-mayhem-
spreads-through-shellshock-exploits.html
Shellshock
● CVE-2014-6271
● CVE-2014-6277
● CVE-2014-6278
● CVE-2014-7169
● CVE-2014-7186
● CVE-2014-7187
● Remover as imagens base dos
containers (Debian, Ubuntu,
CoreOS, etc.)
● Rebuild das imagens
● Novo deploy
Lições aprendidas
Lições aprendidas
● “docker build --rm --no-cache ...” + cautela
● SO com muitas regras de firewall (Iptables)
● Monitoramento dos serviços (aplicações)
Lições aprendidas
● Banco de dados em containers
● Múltiplos comandos por passo (step)
● Use “orquestradores” para aplicações complexas
(Compose, Kubernetes, Mesos, Deis, Flocker, etc)
TODO
● Usar Chef/Puppet
● Implantar CI (Circles)
● Docker Composer
● libnetworking
● Service Discovery
Links
-(Docker) Rede avançado: https://docs.docker.com/articles/networking/
- deb vs. rpm vs. gem: http://lwn.net/Articles/75034/
- Mesos: http://mesos.apache.org/
- Docker + OpenvSwitch: https://goldmann.pl/blog/2014/01/21/connecting-docker-containers-on-multiple-hosts/
- Docker Hub: https://registry.hub.docker.com
- Docker Compose: https://docs.docker.com/compose/
- Docker Swarm: https://docs.docker.com/swarm/
-CoreOS: https://coreos.com/
-Kubernete: http://kubernetes.io/
The Docker Ecosystem: Scheduling and Orchestration: https://www.digitalocean.com/community/tutorials/the-docker-ecosystem-
scheduling-and-orchestration
Contatos
● http://www.fernandoike.com
● fernando.ike at gmail.com
● https://www.linkedin.
com/in/fernandoike
● @fernandoike
● https://hub.docker.com/u/fike/

Docker na vida real