SlideShare uma empresa Scribd logo
Globalcode – Open4education
Aplicações 12 fatores
Melhor com Docker
Wellington F. Silva
Globalcode – Open4education
Wellington F. Silva
a.k.a.: wsilva/tom/boina
técnico em telecom,
programador, devops,
instrutor, escritor, pai
Atualmente na GFG
Globalcode – Open4education
Agenda
O que é Docker?
O que é 12 factor app?
Os 12 fatores
Como o Docker adere a cada fator
Globalcode – Open4education
O que é Docker?
Globalcode – Open4education
O que é Docker?
Globalcode – Open4education
O que é Docker?
Sistema de contêineres Linux
Globalcode – Open4education
O que é Docker?
Sistema de contêineres Linux
Muito leve e rápido
Globalcode – Open4education
O que é Docker?
Sistema de contêineres Linux
Muito leve e rápido
Muitas vantagens em 

relação à virtualização

tradicional
Globalcode – Open4education
O que é Docker?
Sistema de contêineres Linux
Muito leve e rápido
Muitas vantagens em 

relação à virtualização

tradicional
OSS
Globalcode – Open4education
O que é Docker?
Sistema de contêineres Linux
Muito leve e rápido
Muitas vantagens em 

relação à virtualização

tradicional
OSS
Diversas ferramentas de 

orquestração
Globalcode – Open4education
O que é Docker?
Sistema de contêineres Linux
Muito leve e rápido
Muitas vantagens em 

relação à virtualização

tradicional
OSS
Diversas ferramentas de 

orquestração
Virtualização em nível de SO
Globalcode – Open4education
O que é Docker?
Globalcode – Open4education
Cupom de Desconto
TDC25
25% de desconto no site da
Novatec*
sem desculpas pra não
aprender Docker
*para qualquer título
O que é Docker?
Globalcode – Open4education
O que é 12 factor app?
Globalcode – Open4education
O que é 12 factor app?
Metodologia para desenvolvimento de 

webapps e SAAS
Globalcode – Open4education
O que é 12 factor app?
Metodologia para desenvolvimento de 

webapps e SAAS
Aplicável em qualquer linguagem de
programação de alto nível
Globalcode – Open4education
O que é 12 factor app?
Metodologia para desenvolvimento de 

webapps e SAAS
Aplicável em qualquer linguagem de
programação de alto nível
Facilita portabilidade e escalabilidade
Globalcode – Open4education
O que é 12 factor app?
Metodologia para desenvolvimento de 

webapps e SAAS
Aplicável em qualquer linguagem de
programação de alto nível
Facilita portabilidade e escalabilidade
Criado por Adam Wiggins e outros 

colaboradores do Heroku
Globalcode – Open4education
O que é 12 factor app?
Metodologia para desenvolvimento de 

webapps e SAAS
Aplicável em qualquer linguagem de
programação de alto nível
Facilita portabilidade e escalabilidade
Criado por Adam Wiggins e outros 

colaboradores do Heroku
Foca em portabilidade e escalabilidade
Globalcode – Open4education
O que é 12 factor app?
Inspirado no "Patterns of Enterprise 

Application Architecture" e no 

"Refactoring" de Martin Fowler
Globalcode – Open4education
O que é 12 factor app?
http://12factor.net
Globalcode – Open4education
"Quando o relógio bate a uma,
todas as caveiras saem das tumbas."
Tumbalacatumba tumba tá, tumbalacatumba tumba
tá
Globalcode – Open4education
I - Base de Código
Tudo tem que estar no SCM (Source Control
Management)
Globalcode – Open4education
I - Base de Código
Globalcode – Open4education
I - Base de Código
Tudo tem que estar no SCM (Source Control
Management)
Repositório único por app (git, hg, svn, bazaar)
Globalcode – Open4education
I - Base de Código
Tudo tem que estar no SCM (Source Control
Management)
Repositório único por app (git, hg, svn, bazaar)
+ de um codebase é um sistema distribuído
Globalcode – Open4education
I - Base de Código
Tudo tem que estar no SCM (Source Control
Management)
Repositório único por app (git, hg, svn, bazaar)
+ de um codebase é um sistema distribuído
Mais apps num mesmo codebase é errado
Globalcode – Open4education
I - Base de Código
Tudo tem que estar no SCM (Source Control
Management)
Repositório único por app (git, hg, svn, bazaar)
+ de um codebase é um sistema distribuído
Mais apps num mesmo codebase é errado
Vários deploys (dev1, dev2, dev3, staging, qa,
integration, production)
Globalcode – Open4education
I - Base de Código
1 cd 12factor
2 git init .
3 git add web-container/Dockerfile
4 git add web-app/*
5 git commit -m "Iniciando os trabalhos"
6 git remote add origin git@github.com:usuario/
repo.git
7 git push -u origin master
Globalcode – Open4education
I - Base de Código
E o Docker?
Globalcode – Open4education
I - Base de Código
E o Docker?
Dockerfiles versionados
Globalcode – Open4education
I - Base de Código
E o Docker?
Dockerfiles versionados
.dockerignore
Globalcode – Open4education
"Quando o relógio bate as duas,
todas as caveiras pintam as unhas."
Tumbalacatumba tumba tá, tumbalacatumba tumba
tá
Globalcode – Open4education
II - Dependências
Devem ser declaradas explicitamente e isoladas
Globalcode – Open4education
II - Dependências
1 <?php
2
3 require_once "monolog/src/Monolog/Logger.php";
Globalcode – Open4education
II - Dependências
1 <?php
2
3 require_once "monolog/src/Monolog/Logger.php";
1 composer require monolog/monolog
2 composer install
Globalcode – Open4education
II - Dependências
Devem ser declaradas explicitamente e isoladas
Devem estar presentes em um arquivo manifesto
(composer.json, requirements.txt, Gemfile)
Globalcode – Open4education
II - Dependências
Devem ser declaradas explicitamente e isoladas
Devem estar presentes em um arquivo manifesto
(composer.json, requirements.txt, Gemfile)
Utilizar ferramentas de automação (composer,
pip, maven, bundle)
Globalcode – Open4education
II - Dependências
Devem ser declaradas explicitamente e isoladas
Devem estar presentes em um arquivo manifesto
(composer.json, requirements.txt, Gemfile)
Utilizar ferramentas de automação (composer,
pip, maven, bundle)
Dependências de recursos de SO devem ser
vendorizadas em um novo app
Globalcode – Open4education
II - Dependências
Devem ser declaradas explicitamente e isoladas
Devem estar presentes em um arquivo manifesto
(composer.json, requirements.txt, Gemfile)
Utilizar ferramentas de automação (composer,
pip, maven, bundle)
Dependências de recursos de SO devem ser
vendorizadas em um novo app
Mudanças são rapidamente detectadas na
construção
Globalcode – Open4education
II - Dependências
E o Docker?
Dependências ficam explícitas no Dockerfile 

(FROM, ADD, COPY)
Globalcode – Open4education
II - Dependências
1 FROM nginx:1.9.9
2 RUN apt-get update 
3 && apt-get install -y -q --no-install-recommends 
4 ca-certificates 
5 wget 
6 && apt-get clean 
7 && rm -r /var/lib/apt/lists/*
8 RUN echo "daemon off;" >> /etc/nginx/nginx.conf 
9 && sed -i 's/^http {/&n
server_names_hash_bucket_size 128;/g' /etc/nginx/
nginx.conf
Globalcode – Open4education
"Quando o relógio bate as três,
todas as caveiras imitam chinês."
Tumbalacatumba tumba tá, tumbalacatumba tumba
tá
Globalcode – Open4education
III - Configurações
Configurações devem ser armazenadas no
ambiente
Globalcode – Open4education
III - Configurações
Configurações devem ser armazenadas no
ambiente
Configuração é tudo que varia conforme o deploy
(dev, homolog, qa, instâncias em produção)
Globalcode – Open4education
III - Configurações
Configurações devem ser armazenadas no
ambiente
Configuração é tudo que varia conforme o deploy
(dev, homolog, qa, instâncias em produção)
Informações de acesso a recursos (servidores de
storage, serviço de cache, acesso a banco de
dados)
Globalcode – Open4education
III - Configurações
Globalcode – Open4education
III - Configurações
E o Docker?
Ao construir e ao iniciar contêineres devemos
definir os valores das variáveis de ambiente
Globalcode – Open4education
III - Configurações
1 docker run -d --name web 
2 --env TESTING="12 factor" nginx
3 docker run -d --name backend 
4 --env-file ./env-file myimage/backend
5 docker run -d --name db 
6 --env "MYSQL_ROOT_PASSWORD=senha" 
7 --env "MYSQL_DATABASE=mydb" mysql
Globalcode – Open4education
III - Configurações
1 export ENABLE_ENV_FILE="12 factor”
2 export DB_ROOT_PASS=“mutcha-porrada”
3 export DB_USER="maguila”
4 export DB_USER_PASS=“parabolicas-sta-rita”
5 export APP_PASS="w0rdpr355”
Globalcode – Open4education
III - Configurações
# arquivo docker-compose.yml
1 version: '2'
2 services:
3 db:
4 image: mysql:5.6
5 volumes:
6 - "./.data/db:/var/lib/mysql"
7 restart: always
8 environment:
9 MYSQL_ROOT_PASSWORD: ${DB_ROOT_PASS}
10 MYSQL_DATABASE: wordpress
11 MYSQL_USER: ${DB_USER}
12 MYSQL_PASSWORD: ${DB_USER_PASS}
Globalcode – Open4education
III - Configurações
13 wordpress:
14 depends_on:
15 - db
16 image: wordpress:latest
17 links:
18 - db
19 ports:
20 - "8000:80"
21 restart: always
22 environment:
23 ENABLE_ENV_FILE: ${ENABLE_ENV_FILE}
24 WORDPRESS_DB_HOST: db:3306
25 WORDPRESS_DB_PASSWORD: ${APP_PASS}
Globalcode – Open4education
III - Configurações
1 <?php
2
3 /**
4 * Initialize main environment vars and load Yii 2
5 */
6 public static function init()
7 {
8 require('/var/www/vendor/autoload.php');
9
10 // Load .env file if enabled and if it exists
11 if (getenv('ENABLE_ENV_FILE') &&
file_exists(self::APP_DIR.'.env')) {
12 Dotenv::load(self::APP_DIR);
13 }
Globalcode – Open4education
"Quando o relógio bate as quatro,
todas as caveiras tiram retrato."
Tumbalacatumba tumba tá, tumbalacatumba tumba
tá
Globalcode – Open4education
IV - Serviços de Apoio
Trate serviços de apoio como recursos anexos.
Globalcode – Open4education
IV - Serviços de Apoio
Trate serviços de apoio como recursos anexos.
São serviços consumidos via rede
Globalcode – Open4education
IV - Serviços de Apoio
Trate serviços de apoio como recursos anexos.
São serviços consumidos via rede
Exemplos: MySQL, Redis, Memcached, APIs,
serviços de e-mail, Filas
Globalcode – Open4education
IV - Serviços de Apoio
Trate serviços de apoio como recursos anexos.
São serviços consumidos via rede
Exemplos: MySQL, Redis, Memcached, APIs,
serviços de e-mail, Filas
Por ser anexado e podemos trocar o recurso caso
apresente problemas
Globalcode – Open4education
IV - Serviços de Apoio
E o Docker?
No arquivo docker-compose.yml temos as
declarações dos serviços
Globalcode – Open4education
IV - Serviços de Apoio
E o Docker?
No arquivo docker-compose.yml temos as
declarações dos serviços
Os serviços de apoio também podem ser serviços
externos (SAAS) ou outros contêineres
Globalcode – Open4education
IV - Serviços de Apoio
1 version: '2'
2 services:
3 db:
4 image: mysql:5.6
5 volumes:
6 - "./.data/db:/var/lib/mysql"
7 restart: always
8 environment:
9 MYSQL_ROOT_PASSWORD: ${DB_ROOT_PASS}
10 MYSQL_DATABASE: wordpress
11
Globalcode – Open4education
IV - Serviços de Apoio
12 wordpress:
13 depends_on:
14 - db
15 image: wordpress:latest
16 links:
17 - db
18 -
"redis1.bpnp.cfg.sae1.cache.amazonaws.com:cache-live"
19 ports:
20 - "8000:80"
21 restart: always
22 environment:
23 WORDPRESS_DB_HOST: db:3306
24 WORDPRESS_DB_PASSWORD: ${APP_PASS}
Globalcode – Open4education
"Quando o relógio bate as cinco,
todas as caveiras apertam os cintos."
Tumbalacatumba tumba tá, tumbalacatumba tumba tá
Globalcode – Open4education
V - Contruir, lançar e executar
Construção é a montagem do artefato e
provisionamento de dependências
Globalcode – Open4education
V - Contruir, lançar e executar
Construção é a montagem do artefato e
provisionamento de dependências
Na construção que temos que detectar problemas
(testes automatizados)
Globalcode – Open4education
V - Contruir, lançar e executar
Construção é a montagem do artefato e
provisionamento de dependências
Na construção que temos que detectar problemas
(testes automatizados)
Lançamento é combinação do artefato com a
configuração do ambiente de deploy
Globalcode – Open4education
V - Contruir, lançar e executar
Construção é a montagem do artefato e
provisionamento de dependências
Na construção que temos que detectar problemas
(testes automatizados)
Lançamento é combinação do artefato com a
configuração do ambiente de deploy
Cada lançamento deve ter um identificador único
(release)
Globalcode – Open4education
V - Contruir, lançar e executar
Construção é a montagem do artefato e
provisionamento de dependências
Na construção que temos que detectar problemas
(testes automatizados)
Lançamento é combinação do artefato com a
configuração do ambiente de deploy
Cada lançamento deve ter um identificador único
(release)
Execução é a inicialização dos processos para
fazer o app funcionar
Globalcode – Open4education
V - Contruir, lançar e executar
E o Docker?
No Docker temos o slogan: "Build, ship and run
any app anywhere"
Globalcode – Open4education
V - Contruir, lançar e executar
1 docker build 
2 -f Dockerfile-production 
3 -t username/image 
4 ./container/
5 docker push username/image
6 docker run -d username/images
Globalcode – Open4education
"Quando o relógio bate as seis,
todas as caveiras jogam xadrez."
Tumbalacatumba tumba tá, tumbalacatumba tumba tá
Globalcode – Open4education
VI - Processos
Executar a aplicação com um ou mais processos
Globalcode – Open4education
VI - Processos
Executar a aplicação com um ou mais processos
A aplicação não deve guardar estado
Globalcode – Open4education
VI - Processos
Executar a aplicação com um ou mais processos
A aplicação não deve guardar estado
Dados devem ser persistidos e recuperados de
serviços de apoio
Globalcode – Open4education
VI - Processos
Executar a aplicação com um ou mais processos
A aplicação não deve guardar estado
Dados devem ser persistidos e recuperados de
serviços de apoio
Não devem ser daemon ou ter arquivo PID, deve
trabalhar com o ambiente (upstart)
Globalcode – Open4education
VI - Processos
E no Docker?
Cada contêiner tem seu processo único
Globalcode – Open4education
VI - Processos
E no Docker?
Cada contêiner tem seu processo único
Pode ser adicionado processos aos contêineres
Globalcode – Open4education
VI - Processos
1 # docker-compose.yml
2 redis:
3 image: redis:2.8
4 ports:
5 - "6379:6379"
6 entrypoint: ["redis-server"]
7 command: ["--appendonly", "yes"]
Globalcode – Open4education
VI - Processos
8 php:
9 image: php:7-fpm
10 links:
11 - “redis:redis.local"
12 ports:
13 - "9000:9000"
14 entrypoint: ["php-fpm"]
Globalcode – Open4education
"Quando o relógio bate as sete,
todas as caveiras jogam basquete."
Tumbalacatumba tumba tá, tumbalacatumba tumba tá
Globalcode – Open4education
VII - Vínculo de portas
Exportar os serviços através do vínculo de portas
Globalcode – Open4education
VII - Vínculo de portas
Exportar os serviços através do vínculo de portas
Cada app deve escutar e receber as requisições
em sua porta
Globalcode – Open4education
VII - Vínculo de portas
Exportar os serviços através do vínculo de portas
Cada app deve escutar e receber as requisições
em sua porta
E no Docker?
Cada container pode exportar uma porta e o
vínculo é feito em uma porta do host
Globalcode – Open4education
VII - Vínculo de portas
Exportar os serviços através do vínculo de portas
Cada app deve escutar e receber as requisições
em sua porta
E no Docker?
Cada container pode exportar uma porta e o
vínculo é feito em uma porta do host
Podemos escolher qual porta do host será
vinculada ao container
Globalcode – Open4education
VII - Vínculo de portas
1 # docker-compose.yml
2 web:
3 image: wfsilva/nginx-php7
4 ports:
5 - "80"
6 - "443"
7 - "172.16.0.10:8000:8000"
Globalcode – Open4education
"Quando o relógio bate as oito,
todas as caveiras comem biscoito.”
Tumbalacatumba tumba tá, tumbalacatumba tumba
tá
Globalcode – Open4education
VIII - Concorrência
Escalar com base no processo usado como
modelo
Globalcode – Open4education
VIII - Concorrência
Escalar com base no processo usado como
modelo
Processos podem ser web ou workers
Globalcode – Open4education
VIII - Concorrência
Escalar com base no processo usado como
modelo
Processos podem ser web ou workers
Mais processos em paralelo, mais requisições
são respondidas ou mais rápido terminam
processamentos em lote.
Globalcode – Open4education
VIII - Concorrência
E no Docker?
Podemos escalar a quantidade de contêineres
que executam uma tarefa.
Globalcode – Open4education
VIII - Concorrência
1 docker-compose scale web=34 worker=23
2 docker-compose scale web=1 worker=1
Globalcode – Open4education
"Quando o relógio bate as nove,
todas as caveiras se sacodem."
Tumbalacatumba tumba tá, tumbalacatumba tumba tá
Globalcode – Open4education
IX - Descartabilidade
Maximizar robustez
Globalcode – Open4education
IX - Descartabilidade
Maximizar robustez
Inicialização rápida e desligamento normal e
suave (gracefully shutdown)
Globalcode – Open4education
IX - Descartabilidade
Maximizar robustez
Inicialização rápida e desligamento normal e
suave (gracefully shutdown)
Processos do app são descartáveis
Globalcode – Open4education
IX - Descartabilidade
Maximizar robustez
Inicialização rápida e desligamento normal e
suave (gracefully shutdown)
Processos do app são descartáveis
Facilita escalonamento rápido e elástico
Globalcode – Open4education
IX - Descartabilidade
Maximizar robustez
Inicialização rápida e desligamento normal e
suave (gracefully shutdown)
Processos do app são descartáveis
Facilita escalonamento rápido e elástico
Evitar desligamento repentino (crash)
Globalcode – Open4education
IX - Descartabilidade
E no Docker?
Trocar uma configuração de um contêiner, subir
novos e desligar os antigos
Globalcode – Open4education
IX - Descartabilidade
E no Docker?
Trocar uma configuração de um contêiner, subir
novos e desligar os antigos
Em um Swarm quando um nó cai os containers
são reorganizados nos demais nós.
Globalcode – Open4education
IX - Descartabilidade
1 docker run -d -P 
2 --memory=512M 
3 --name webserver 
4 nginx
5 docker update --memory=1G webserver
Globalcode – Open4education
"Quando o relógio bate as dez,
todas as caveiras comem pastéis."
Tumbalacatumba tumba tá, tumbalacatumba tumba tá
Globalcode – Open4education
X - Paridade Dev/Prod
Manter os ambientes mais similares
(desenvolvimento, homologação, produção)
Globalcode – Open4education
X - Paridade Dev/Prod
Manter os ambientes mais similares
(desenvolvimento, homologação, produção)
Minimizar a lacuna de tempo (deploy em horas ou
minutos)
Globalcode – Open4education
X - Paridade Dev/Prod
Manter os ambientes mais similares
(desenvolvimento, homologação, produção)
Minimizar a lacuna de tempo (deploy em horas ou
minutos)
Minimizar a lacuna de pessoal (devs codam, ops
fazem deploy)
Globalcode – Open4education
X - Paridade Dev/Prod
Manter os ambientes mais similares
(desenvolvimento, homologação, produção)
Minimizar a lacuna de tempo (deploy em horas ou
minutos)
Minimizar a lacuna de pessoal (devs codam, ops
fazem deploy)
Minimizar a lacuna de ferramentas (Dev com
OSX, Nginx 1.2.1, PHP 7.0.3 e MySQL 5.6 -
Prod com Nginx 1.9, PHP 5.5.33 e Percona 5.6)
Globalcode – Open4education
X - Paridade Dev/Prod
E no Docker?
Os contêineres que rodam em dev tem as
mesmas versões das instâncias em produção
Globalcode – Open4education
X - Paridade Dev/Prod
1 percona:
2 image: percona:5.6
3 ports:
4 - "3306:3306"
5 environment:
6 - "MYSQL_ROOT_PASSWORD=senha"
7 - "MYSQL_DATABASE=db"
Globalcode – Open4education
X - Paridade Dev/Prod
8 rabbit:
9 image: rabbitmq:3-management
10 ports:
11 - "5672:5672"
12 - "15672:15672"
13 environment:
14 - "TERM=linux"
15 - "RABBITMQ_NODENAME=rabbit"
16 - "RABBITMQ_DEFAULT_PASS=senha"
17 - "RABBITMQ_DEFAULT_USER=admin"
Globalcode – Open4education
X - Paridade Dev/Prod
18 redis:
19 image: redis:2.8
20 ports:
21 - "6379:6379"
22 entrypoint: ["redis-server"]
23 command: ["--appendonly", "yes"]
24 memcached:
25 image: memcached:1.4
26 ports:
27 - "11211:11211"
Globalcode – Open4education
"Quando o relógio bate as onze,
todas as caveiras sobem no bonde."
Tumbalacatumba tumba tá, tumbalacatumba tumba tá
Globalcode – Open4education
XI - Logs
Logs como fluxo de eventos ordenados no tempo
Globalcode – Open4education
XI - Logs
Logs como fluxo de eventos ordenados no tempo
O app escreve os eventos no fluxo stdout
Globalcode – Open4education
XI - Logs
Logs como fluxo de eventos ordenados no tempo
O app escreve os eventos no fluxo stdout
Em dev os logs são consultados acessando os
arquivos
Globalcode – Open4education
XI - Logs
Logs como fluxo de eventos ordenados no tempo
O app escreve os eventos no fluxo stdout
Em dev os logs são consultados acessando os
arquivos
Em homolog e produção são capturados em
roteadores tipo fluent, logplex, logstash
Globalcode – Open4education
XI - Logs
Logs como fluxo de eventos ordenados no tempo
O app escreve os eventos no fluxo stdout
Em dev os logs são consultados acessando os
arquivos
Em homolog e produção são capturados em
roteadores tipo fluent, logplex, logstash
Busca e apresentação de logs com ferramentas
tipo ELK (Elastic Search, Logstash e Kibana)
Globalcode – Open4education
XI - Logs
E o Docker?
Containers tem drivers de log
Globalcode – Open4education
XI - Logs
E o Docker?
Containers tem drivers de log
Suporte a json-file, syslog, journald, gelf, fluentd,
awslogs e splunk
Globalcode – Open4education
XI - Logs
1 docker run 
2 --log-driver=fluentd 
3 --log-opt fluentd-address=localhost:24224 
4 --log-opt tag=docker.{{.Name}}
Globalcode – Open4education
"Quando o relógio bate as doze,
todas as caveiras fazem pose"
Tumbalacatumba tumba tá, tumbalacatumba tumba tá
Globalcode – Open4education
XII - Processos Administrativos
Tarefas administrativas são como processos
pontuais
Globalcode – Open4education
XII - Processos Administrativos
Tarefas administrativas são como processos
pontuais
Tem que rodar no mesmo codebase
Globalcode – Open4education
XII - Processos Administrativos
Tarefas administrativas são como processos
pontuais
Tem que rodar no mesmo codebase
Executar em ambiente idêntico
Globalcode – Open4education
XII - Processos Administrativos
Tarefas administrativas são como processos
pontuais
Tem que rodar no mesmo codebase
Executar em ambiente idêntico
Migrações de banco
Globalcode – Open4education
XII - Processos Administrativos
Tarefas administrativas são como processos
pontuais
Tem que rodar no mesmo codebase
Executar em ambiente idêntico
Migrações de banco
Scripts de rotinas
Globalcode – Open4education
XII - Processos Administrativos
Docker
Técnica de conteinerização de comandos
Globalcode – Open4education
XII - Processos Administrativos
Docker
Técnica de conteinerização de comandos
Adicionar processo ao contêiner com docker exec
Globalcode – Open4education
XII - Processos Administrativos
1 # subindo o server
2 docker run --name db -d -P 
3 --env "MYSQL_ROOT_PASSWORD=senha" 
4 --env "MYSQL_DATABASE=banco" 
5 percona
Globalcode – Open4education
XII - Processos Administrativos
6 # rodando o client
7 docker run -it 
8 --link db:db 
9 --rm percona 
10 sh -c 'exec mysql -h"$MYSQL_PORT_3306_TCP_ADDR" 

11 -P"$MYSQL_PORT_3306_TCP_PORT" -uroot 
12 -p"$MYSQL_ENV_MYSQL_ROOT_PASSWORD"'
Globalcode – Open4education
XII - Processos Administrativos
1 # exemplo docker exec
2 docker exec -it phpcontainer /usr/bin/top
Globalcode – Open4education
Concluindo
Não são regras, são sugestões de boas práticas
Globalcode – Open4education
Concluindo
Não são regras, são sugestões de boas práticas
Os 12 fatores não farão sua aplicação melhor
Globalcode – Open4education
Concluindo
Não são regras, são sugestões de boas práticas
Os 12 fatores não farão sua aplicação melhor
Os 12 fatores vão trazer a facilidade de trabalhar
com sua aplicação em ambientes de cloud
Globalcode – Open4education
Concluindo
Não são regras, são sugestões de boas práticas
Os 12 fatores não farão sua aplicação melhor
Os 12 fatores vão trazer a facilidade de trabalhar
com sua aplicação em ambientes de cloud
Docker tem uma grande aderência aos 12 fatores
Globalcode – Open4education
Slides & Feedback
https://joind.in/talk/0a473
https://speakerdeck.com/wsilva

Mais conteúdo relacionado

Mais procurados

Mais procurados (20)

Padrões de deploy para DevOps e Entrega Contínua, por Danilo Sato
Padrões de deploy para DevOps e Entrega Contínua, por Danilo SatoPadrões de deploy para DevOps e Entrega Contínua, por Danilo Sato
Padrões de deploy para DevOps e Entrega Contínua, por Danilo Sato
 
Mercurianos - .Net na Prática - Da instalação até o debug da nossa API em um ...
Mercurianos - .Net na Prática - Da instalação até o debug da nossa API em um ...Mercurianos - .Net na Prática - Da instalação até o debug da nossa API em um ...
Mercurianos - .Net na Prática - Da instalação até o debug da nossa API em um ...
 
Introducao Spring ROO
Introducao Spring ROOIntroducao Spring ROO
Introducao Spring ROO
 
Logs, pra que te quero! @ TDC SP 2017
Logs, pra que te quero! @ TDC SP 2017Logs, pra que te quero! @ TDC SP 2017
Logs, pra que te quero! @ TDC SP 2017
 
Ferramentas Essenciais para Desenvolvedores de Plugins WordPress
Ferramentas Essenciais para Desenvolvedores de Plugins WordPressFerramentas Essenciais para Desenvolvedores de Plugins WordPress
Ferramentas Essenciais para Desenvolvedores de Plugins WordPress
 
Rails API com GraphQL
Rails API com GraphQLRails API com GraphQL
Rails API com GraphQL
 
Plataforma Spring e Novidades Spring 3
Plataforma Spring e Novidades Spring 3Plataforma Spring e Novidades Spring 3
Plataforma Spring e Novidades Spring 3
 
TDC2018SP | Trilha PHP Essencial - O que nao fazer ao atualizar para o PHP 7
TDC2018SP | Trilha PHP Essencial - O que nao fazer ao atualizar para o PHP 7TDC2018SP | Trilha PHP Essencial - O que nao fazer ao atualizar para o PHP 7
TDC2018SP | Trilha PHP Essencial - O que nao fazer ao atualizar para o PHP 7
 
GIT Básico
GIT BásicoGIT Básico
GIT Básico
 
DevOps com Exemplos Práticos - QConRio 2014
DevOps com Exemplos Práticos - QConRio 2014DevOps com Exemplos Práticos - QConRio 2014
DevOps com Exemplos Práticos - QConRio 2014
 
Tutorial Setup projeto JADE e ROS
Tutorial Setup projeto JADE e ROSTutorial Setup projeto JADE e ROS
Tutorial Setup projeto JADE e ROS
 
.NET Core e ASP.NET Core: Presente e Futuro - .NET Conf Local 2018 - Campinas...
.NET Core e ASP.NET Core: Presente e Futuro - .NET Conf Local 2018 - Campinas....NET Core e ASP.NET Core: Presente e Futuro - .NET Conf Local 2018 - Campinas...
.NET Core e ASP.NET Core: Presente e Futuro - .NET Conf Local 2018 - Campinas...
 
.NET Core e ASP.NET Core: Presente e Futuro - .NET Conf Local 2018 - .NET SP ...
.NET Core e ASP.NET Core: Presente e Futuro - .NET Conf Local 2018 - .NET SP ....NET Core e ASP.NET Core: Presente e Futuro - .NET Conf Local 2018 - .NET SP ...
.NET Core e ASP.NET Core: Presente e Futuro - .NET Conf Local 2018 - .NET SP ...
 
Spring roo - Criando aplicações Java Web em poucos minutos
Spring roo - Criando aplicações Java Web em poucos minutosSpring roo - Criando aplicações Java Web em poucos minutos
Spring roo - Criando aplicações Java Web em poucos minutos
 
Desenvolvimento RIA com GWT e Spring
Desenvolvimento RIA com GWT e SpringDesenvolvimento RIA com GWT e Spring
Desenvolvimento RIA com GWT e Spring
 
Java enterprise - testcontainers
Java enterprise - testcontainersJava enterprise - testcontainers
Java enterprise - testcontainers
 
Java em 2021
Java em 2021Java em 2021
Java em 2021
 
Git
GitGit
Git
 
Latinoware - Quarkus io cloud native apps
Latinoware - Quarkus io cloud native appsLatinoware - Quarkus io cloud native apps
Latinoware - Quarkus io cloud native apps
 
Introducao ao Git
Introducao ao GitIntroducao ao Git
Introducao ao Git
 

Semelhante a Aplicações 12 fatores, melhor com Docker

Open4Education | MC122 - Introdução a ALM OpenSource
Open4Education | MC122 - Introdução a ALM OpenSourceOpen4Education | MC122 - Introdução a ALM OpenSource
Open4Education | MC122 - Introdução a ALM OpenSource
tdc-globalcode
 
Introdução ao NodeJS
Introdução ao NodeJSIntrodução ao NodeJS
Introdução ao NodeJS
Giovanni Bassi
 

Semelhante a Aplicações 12 fatores, melhor com Docker (20)

TDC2018SP | Trilha Testes II - Descomplicando a montagem de ambientes de Test...
TDC2018SP | Trilha Testes II - Descomplicando a montagem de ambientes de Test...TDC2018SP | Trilha Testes II - Descomplicando a montagem de ambientes de Test...
TDC2018SP | Trilha Testes II - Descomplicando a montagem de ambientes de Test...
 
ASP.NET vNext no .NET Architects Days 2014
ASP.NET vNext no .NET Architects Days 2014ASP.NET vNext no .NET Architects Days 2014
ASP.NET vNext no .NET Architects Days 2014
 
Banco de Dados - Docker Compose + Bancos Relacionais: descomplicando a montag...
Banco de Dados - Docker Compose + Bancos Relacionais: descomplicando a montag...Banco de Dados - Docker Compose + Bancos Relacionais: descomplicando a montag...
Banco de Dados - Docker Compose + Bancos Relacionais: descomplicando a montag...
 
Banco de Dados - Docker Compose + Bancos NoSQL: descomplicando a montagem de ...
Banco de Dados - Docker Compose + Bancos NoSQL: descomplicando a montagem de ...Banco de Dados - Docker Compose + Bancos NoSQL: descomplicando a montagem de ...
Banco de Dados - Docker Compose + Bancos NoSQL: descomplicando a montagem de ...
 
Introdução ao Habitat
Introdução ao HabitatIntrodução ao Habitat
Introdução ao Habitat
 
Banco de Dados - Docker Compose + Bancos NoSQL: descomplicando a montagem de ...
Banco de Dados - Docker Compose + Bancos NoSQL: descomplicando a montagem de ...Banco de Dados - Docker Compose + Bancos NoSQL: descomplicando a montagem de ...
Banco de Dados - Docker Compose + Bancos NoSQL: descomplicando a montagem de ...
 
Desenvolvendo e implantando aplicações PHP utilizando Docker
Desenvolvendo e implantando aplicações PHP utilizando DockerDesenvolvendo e implantando aplicações PHP utilizando Docker
Desenvolvendo e implantando aplicações PHP utilizando Docker
 
TDC2018SP | Trilha Blockchain - Criando minha Primeira Blockchain Privada (DL...
TDC2018SP | Trilha Blockchain - Criando minha Primeira Blockchain Privada (DL...TDC2018SP | Trilha Blockchain - Criando minha Primeira Blockchain Privada (DL...
TDC2018SP | Trilha Blockchain - Criando minha Primeira Blockchain Privada (DL...
 
The twelve factor apps and openruko
The twelve factor apps and openrukoThe twelve factor apps and openruko
The twelve factor apps and openruko
 
Open4Education | MC122 - Introdução a ALM OpenSource
Open4Education | MC122 - Introdução a ALM OpenSourceOpen4Education | MC122 - Introdução a ALM OpenSource
Open4Education | MC122 - Introdução a ALM OpenSource
 
Containers com docker #CPRecife4
Containers com docker #CPRecife4Containers com docker #CPRecife4
Containers com docker #CPRecife4
 
Construção e provisionamento de ambientes de desenvolvimento virtualizados
Construção e provisionamento de ambientes  de desenvolvimento virtualizadosConstrução e provisionamento de ambientes  de desenvolvimento virtualizados
Construção e provisionamento de ambientes de desenvolvimento virtualizados
 
WildFly Avançado - TDC Floripa 2015
WildFly Avançado - TDC Floripa 2015WildFly Avançado - TDC Floripa 2015
WildFly Avançado - TDC Floripa 2015
 
Utilização de DevOps
Utilização de DevOpsUtilização de DevOps
Utilização de DevOps
 
Migração de Banco de Dados - Oracle para MongoDB - TDC2014
Migração de Banco de Dados - Oracle para MongoDB - TDC2014Migração de Banco de Dados - Oracle para MongoDB - TDC2014
Migração de Banco de Dados - Oracle para MongoDB - TDC2014
 
Utilizando containers docker para ap is em asp.net core com app service linux
Utilizando containers docker para ap is em asp.net core com app service linuxUtilizando containers docker para ap is em asp.net core com app service linux
Utilizando containers docker para ap is em asp.net core com app service linux
 
Cloud Native Microservices - Rumo a uma Arquitetura de Microsserviços Nativos...
Cloud Native Microservices - Rumo a uma Arquitetura de Microsserviços Nativos...Cloud Native Microservices - Rumo a uma Arquitetura de Microsserviços Nativos...
Cloud Native Microservices - Rumo a uma Arquitetura de Microsserviços Nativos...
 
TDC2016SP - Por dentro do .Net Core
TDC2016SP - Por dentro do .Net CoreTDC2016SP - Por dentro do .Net Core
TDC2016SP - Por dentro do .Net Core
 
Alagoas Dev Day
Alagoas Dev DayAlagoas Dev Day
Alagoas Dev Day
 
Introdução ao NodeJS
Introdução ao NodeJSIntrodução ao NodeJS
Introdução ao NodeJS
 

Mais de Wellington Silva

Mais de Wellington Silva (16)

Docker do básico a orquestração (PHPeste2016)
Docker do básico a orquestração (PHPeste2016)Docker do básico a orquestração (PHPeste2016)
Docker do básico a orquestração (PHPeste2016)
 
Aplicação Distribuída com Docker Swarm (Meetup GruPy-SP)
Aplicação Distribuída com Docker Swarm (Meetup GruPy-SP)Aplicação Distribuída com Docker Swarm (Meetup GruPy-SP)
Aplicação Distribuída com Docker Swarm (Meetup GruPy-SP)
 
Afinal, o que é Docker? (Meetup Laravel #12)
Afinal, o que é Docker? (Meetup Laravel #12)Afinal, o que é Docker? (Meetup Laravel #12)
Afinal, o que é Docker? (Meetup Laravel #12)
 
Afinal, o que é Docker? (Webinar Umbler)
Afinal, o que é Docker? (Webinar Umbler)Afinal, o que é Docker? (Webinar Umbler)
Afinal, o que é Docker? (Webinar Umbler)
 
O que é o Docker afinal? (Workshop Novatec)
O que é o Docker afinal? (Workshop Novatec)O que é o Docker afinal? (Workshop Novatec)
O que é o Docker afinal? (Workshop Novatec)
 
Começando com o Docker (HackerHouseBR)
Começando com o Docker (HackerHouseBR)Começando com o Docker (HackerHouseBR)
Começando com o Docker (HackerHouseBR)
 
Do monolito aos microserviços com Docker (PHPSP+IMA)
Do monolito aos microserviços com Docker (PHPSP+IMA)Do monolito aos microserviços com Docker (PHPSP+IMA)
Do monolito aos microserviços com Docker (PHPSP+IMA)
 
O poder do Docker (7º meetup de Docker SP)
O poder do Docker (7º meetup de Docker SP)O poder do Docker (7º meetup de Docker SP)
O poder do Docker (7º meetup de Docker SP)
 
O poder do Docker (7 Masters)
O poder do Docker (7 Masters)O poder do Docker (7 Masters)
O poder do Docker (7 Masters)
 
Contêineres e VMs no mundo dos E-commerces (Devcommerce2016)
Contêineres e VMs no mundo dos E-commerces (Devcommerce2016)Contêineres e VMs no mundo dos E-commerces (Devcommerce2016)
Contêineres e VMs no mundo dos E-commerces (Devcommerce2016)
 
Docker from basics to orchestration (PHPConfBr2015)
Docker from basics to orchestration (PHPConfBr2015)Docker from basics to orchestration (PHPConfBr2015)
Docker from basics to orchestration (PHPConfBr2015)
 
Talk on PHP Day Uruguay about Docker
Talk on PHP Day Uruguay about DockerTalk on PHP Day Uruguay about Docker
Talk on PHP Day Uruguay about Docker
 
Vagrant vs docker? Melhor vagrant + docker
Vagrant vs docker? Melhor vagrant + dockerVagrant vs docker? Melhor vagrant + docker
Vagrant vs docker? Melhor vagrant + docker
 
Gnu/Linux - Workshop EACH-USP
Gnu/Linux - Workshop EACH-USPGnu/Linux - Workshop EACH-USP
Gnu/Linux - Workshop EACH-USP
 
Talk no Meetup LaravelSP #3
Talk no Meetup LaravelSP #3Talk no Meetup LaravelSP #3
Talk no Meetup LaravelSP #3
 
Light Talk Docker Compose
Light Talk Docker ComposeLight Talk Docker Compose
Light Talk Docker Compose
 

Aplicações 12 fatores, melhor com Docker

  • 1. Globalcode – Open4education Aplicações 12 fatores Melhor com Docker Wellington F. Silva
  • 2. Globalcode – Open4education Wellington F. Silva a.k.a.: wsilva/tom/boina técnico em telecom, programador, devops, instrutor, escritor, pai Atualmente na GFG
  • 3. Globalcode – Open4education Agenda O que é Docker? O que é 12 factor app? Os 12 fatores Como o Docker adere a cada fator
  • 6. Globalcode – Open4education O que é Docker? Sistema de contêineres Linux
  • 7. Globalcode – Open4education O que é Docker? Sistema de contêineres Linux Muito leve e rápido
  • 8. Globalcode – Open4education O que é Docker? Sistema de contêineres Linux Muito leve e rápido Muitas vantagens em 
 relação à virtualização
 tradicional
  • 9. Globalcode – Open4education O que é Docker? Sistema de contêineres Linux Muito leve e rápido Muitas vantagens em 
 relação à virtualização
 tradicional OSS
  • 10. Globalcode – Open4education O que é Docker? Sistema de contêineres Linux Muito leve e rápido Muitas vantagens em 
 relação à virtualização
 tradicional OSS Diversas ferramentas de 
 orquestração
  • 11. Globalcode – Open4education O que é Docker? Sistema de contêineres Linux Muito leve e rápido Muitas vantagens em 
 relação à virtualização
 tradicional OSS Diversas ferramentas de 
 orquestração Virtualização em nível de SO
  • 13. Globalcode – Open4education Cupom de Desconto TDC25 25% de desconto no site da Novatec* sem desculpas pra não aprender Docker *para qualquer título O que é Docker?
  • 14. Globalcode – Open4education O que é 12 factor app?
  • 15. Globalcode – Open4education O que é 12 factor app? Metodologia para desenvolvimento de 
 webapps e SAAS
  • 16. Globalcode – Open4education O que é 12 factor app? Metodologia para desenvolvimento de 
 webapps e SAAS Aplicável em qualquer linguagem de programação de alto nível
  • 17. Globalcode – Open4education O que é 12 factor app? Metodologia para desenvolvimento de 
 webapps e SAAS Aplicável em qualquer linguagem de programação de alto nível Facilita portabilidade e escalabilidade
  • 18. Globalcode – Open4education O que é 12 factor app? Metodologia para desenvolvimento de 
 webapps e SAAS Aplicável em qualquer linguagem de programação de alto nível Facilita portabilidade e escalabilidade Criado por Adam Wiggins e outros 
 colaboradores do Heroku
  • 19. Globalcode – Open4education O que é 12 factor app? Metodologia para desenvolvimento de 
 webapps e SAAS Aplicável em qualquer linguagem de programação de alto nível Facilita portabilidade e escalabilidade Criado por Adam Wiggins e outros 
 colaboradores do Heroku Foca em portabilidade e escalabilidade
  • 20. Globalcode – Open4education O que é 12 factor app? Inspirado no "Patterns of Enterprise 
 Application Architecture" e no 
 "Refactoring" de Martin Fowler
  • 21. Globalcode – Open4education O que é 12 factor app? http://12factor.net
  • 22. Globalcode – Open4education "Quando o relógio bate a uma, todas as caveiras saem das tumbas." Tumbalacatumba tumba tá, tumbalacatumba tumba tá
  • 23. Globalcode – Open4education I - Base de Código Tudo tem que estar no SCM (Source Control Management)
  • 24. Globalcode – Open4education I - Base de Código
  • 25. Globalcode – Open4education I - Base de Código Tudo tem que estar no SCM (Source Control Management) Repositório único por app (git, hg, svn, bazaar)
  • 26. Globalcode – Open4education I - Base de Código Tudo tem que estar no SCM (Source Control Management) Repositório único por app (git, hg, svn, bazaar) + de um codebase é um sistema distribuído
  • 27. Globalcode – Open4education I - Base de Código Tudo tem que estar no SCM (Source Control Management) Repositório único por app (git, hg, svn, bazaar) + de um codebase é um sistema distribuído Mais apps num mesmo codebase é errado
  • 28. Globalcode – Open4education I - Base de Código Tudo tem que estar no SCM (Source Control Management) Repositório único por app (git, hg, svn, bazaar) + de um codebase é um sistema distribuído Mais apps num mesmo codebase é errado Vários deploys (dev1, dev2, dev3, staging, qa, integration, production)
  • 29. Globalcode – Open4education I - Base de Código 1 cd 12factor 2 git init . 3 git add web-container/Dockerfile 4 git add web-app/* 5 git commit -m "Iniciando os trabalhos" 6 git remote add origin git@github.com:usuario/ repo.git 7 git push -u origin master
  • 30. Globalcode – Open4education I - Base de Código E o Docker?
  • 31. Globalcode – Open4education I - Base de Código E o Docker? Dockerfiles versionados
  • 32. Globalcode – Open4education I - Base de Código E o Docker? Dockerfiles versionados .dockerignore
  • 33. Globalcode – Open4education "Quando o relógio bate as duas, todas as caveiras pintam as unhas." Tumbalacatumba tumba tá, tumbalacatumba tumba tá
  • 34. Globalcode – Open4education II - Dependências Devem ser declaradas explicitamente e isoladas
  • 35. Globalcode – Open4education II - Dependências 1 <?php 2 3 require_once "monolog/src/Monolog/Logger.php";
  • 36. Globalcode – Open4education II - Dependências 1 <?php 2 3 require_once "monolog/src/Monolog/Logger.php"; 1 composer require monolog/monolog 2 composer install
  • 37. Globalcode – Open4education II - Dependências Devem ser declaradas explicitamente e isoladas Devem estar presentes em um arquivo manifesto (composer.json, requirements.txt, Gemfile)
  • 38. Globalcode – Open4education II - Dependências Devem ser declaradas explicitamente e isoladas Devem estar presentes em um arquivo manifesto (composer.json, requirements.txt, Gemfile) Utilizar ferramentas de automação (composer, pip, maven, bundle)
  • 39. Globalcode – Open4education II - Dependências Devem ser declaradas explicitamente e isoladas Devem estar presentes em um arquivo manifesto (composer.json, requirements.txt, Gemfile) Utilizar ferramentas de automação (composer, pip, maven, bundle) Dependências de recursos de SO devem ser vendorizadas em um novo app
  • 40. Globalcode – Open4education II - Dependências Devem ser declaradas explicitamente e isoladas Devem estar presentes em um arquivo manifesto (composer.json, requirements.txt, Gemfile) Utilizar ferramentas de automação (composer, pip, maven, bundle) Dependências de recursos de SO devem ser vendorizadas em um novo app Mudanças são rapidamente detectadas na construção
  • 41. Globalcode – Open4education II - Dependências E o Docker? Dependências ficam explícitas no Dockerfile 
 (FROM, ADD, COPY)
  • 42. Globalcode – Open4education II - Dependências 1 FROM nginx:1.9.9 2 RUN apt-get update 3 && apt-get install -y -q --no-install-recommends 4 ca-certificates 5 wget 6 && apt-get clean 7 && rm -r /var/lib/apt/lists/* 8 RUN echo "daemon off;" >> /etc/nginx/nginx.conf 9 && sed -i 's/^http {/&n server_names_hash_bucket_size 128;/g' /etc/nginx/ nginx.conf
  • 43. Globalcode – Open4education "Quando o relógio bate as três, todas as caveiras imitam chinês." Tumbalacatumba tumba tá, tumbalacatumba tumba tá
  • 44. Globalcode – Open4education III - Configurações Configurações devem ser armazenadas no ambiente
  • 45. Globalcode – Open4education III - Configurações Configurações devem ser armazenadas no ambiente Configuração é tudo que varia conforme o deploy (dev, homolog, qa, instâncias em produção)
  • 46. Globalcode – Open4education III - Configurações Configurações devem ser armazenadas no ambiente Configuração é tudo que varia conforme o deploy (dev, homolog, qa, instâncias em produção) Informações de acesso a recursos (servidores de storage, serviço de cache, acesso a banco de dados)
  • 48. Globalcode – Open4education III - Configurações E o Docker? Ao construir e ao iniciar contêineres devemos definir os valores das variáveis de ambiente
  • 49. Globalcode – Open4education III - Configurações 1 docker run -d --name web 2 --env TESTING="12 factor" nginx 3 docker run -d --name backend 4 --env-file ./env-file myimage/backend 5 docker run -d --name db 6 --env "MYSQL_ROOT_PASSWORD=senha" 7 --env "MYSQL_DATABASE=mydb" mysql
  • 50. Globalcode – Open4education III - Configurações 1 export ENABLE_ENV_FILE="12 factor” 2 export DB_ROOT_PASS=“mutcha-porrada” 3 export DB_USER="maguila” 4 export DB_USER_PASS=“parabolicas-sta-rita” 5 export APP_PASS="w0rdpr355”
  • 51. Globalcode – Open4education III - Configurações # arquivo docker-compose.yml 1 version: '2' 2 services: 3 db: 4 image: mysql:5.6 5 volumes: 6 - "./.data/db:/var/lib/mysql" 7 restart: always 8 environment: 9 MYSQL_ROOT_PASSWORD: ${DB_ROOT_PASS} 10 MYSQL_DATABASE: wordpress 11 MYSQL_USER: ${DB_USER} 12 MYSQL_PASSWORD: ${DB_USER_PASS}
  • 52. Globalcode – Open4education III - Configurações 13 wordpress: 14 depends_on: 15 - db 16 image: wordpress:latest 17 links: 18 - db 19 ports: 20 - "8000:80" 21 restart: always 22 environment: 23 ENABLE_ENV_FILE: ${ENABLE_ENV_FILE} 24 WORDPRESS_DB_HOST: db:3306 25 WORDPRESS_DB_PASSWORD: ${APP_PASS}
  • 53. Globalcode – Open4education III - Configurações 1 <?php 2 3 /** 4 * Initialize main environment vars and load Yii 2 5 */ 6 public static function init() 7 { 8 require('/var/www/vendor/autoload.php'); 9 10 // Load .env file if enabled and if it exists 11 if (getenv('ENABLE_ENV_FILE') && file_exists(self::APP_DIR.'.env')) { 12 Dotenv::load(self::APP_DIR); 13 }
  • 54. Globalcode – Open4education "Quando o relógio bate as quatro, todas as caveiras tiram retrato." Tumbalacatumba tumba tá, tumbalacatumba tumba tá
  • 55. Globalcode – Open4education IV - Serviços de Apoio Trate serviços de apoio como recursos anexos.
  • 56. Globalcode – Open4education IV - Serviços de Apoio Trate serviços de apoio como recursos anexos. São serviços consumidos via rede
  • 57. Globalcode – Open4education IV - Serviços de Apoio Trate serviços de apoio como recursos anexos. São serviços consumidos via rede Exemplos: MySQL, Redis, Memcached, APIs, serviços de e-mail, Filas
  • 58. Globalcode – Open4education IV - Serviços de Apoio Trate serviços de apoio como recursos anexos. São serviços consumidos via rede Exemplos: MySQL, Redis, Memcached, APIs, serviços de e-mail, Filas Por ser anexado e podemos trocar o recurso caso apresente problemas
  • 59. Globalcode – Open4education IV - Serviços de Apoio E o Docker? No arquivo docker-compose.yml temos as declarações dos serviços
  • 60. Globalcode – Open4education IV - Serviços de Apoio E o Docker? No arquivo docker-compose.yml temos as declarações dos serviços Os serviços de apoio também podem ser serviços externos (SAAS) ou outros contêineres
  • 61. Globalcode – Open4education IV - Serviços de Apoio 1 version: '2' 2 services: 3 db: 4 image: mysql:5.6 5 volumes: 6 - "./.data/db:/var/lib/mysql" 7 restart: always 8 environment: 9 MYSQL_ROOT_PASSWORD: ${DB_ROOT_PASS} 10 MYSQL_DATABASE: wordpress 11
  • 62. Globalcode – Open4education IV - Serviços de Apoio 12 wordpress: 13 depends_on: 14 - db 15 image: wordpress:latest 16 links: 17 - db 18 - "redis1.bpnp.cfg.sae1.cache.amazonaws.com:cache-live" 19 ports: 20 - "8000:80" 21 restart: always 22 environment: 23 WORDPRESS_DB_HOST: db:3306 24 WORDPRESS_DB_PASSWORD: ${APP_PASS}
  • 63. Globalcode – Open4education "Quando o relógio bate as cinco, todas as caveiras apertam os cintos." Tumbalacatumba tumba tá, tumbalacatumba tumba tá
  • 64. Globalcode – Open4education V - Contruir, lançar e executar Construção é a montagem do artefato e provisionamento de dependências
  • 65. Globalcode – Open4education V - Contruir, lançar e executar Construção é a montagem do artefato e provisionamento de dependências Na construção que temos que detectar problemas (testes automatizados)
  • 66. Globalcode – Open4education V - Contruir, lançar e executar Construção é a montagem do artefato e provisionamento de dependências Na construção que temos que detectar problemas (testes automatizados) Lançamento é combinação do artefato com a configuração do ambiente de deploy
  • 67. Globalcode – Open4education V - Contruir, lançar e executar Construção é a montagem do artefato e provisionamento de dependências Na construção que temos que detectar problemas (testes automatizados) Lançamento é combinação do artefato com a configuração do ambiente de deploy Cada lançamento deve ter um identificador único (release)
  • 68. Globalcode – Open4education V - Contruir, lançar e executar Construção é a montagem do artefato e provisionamento de dependências Na construção que temos que detectar problemas (testes automatizados) Lançamento é combinação do artefato com a configuração do ambiente de deploy Cada lançamento deve ter um identificador único (release) Execução é a inicialização dos processos para fazer o app funcionar
  • 69. Globalcode – Open4education V - Contruir, lançar e executar E o Docker? No Docker temos o slogan: "Build, ship and run any app anywhere"
  • 70. Globalcode – Open4education V - Contruir, lançar e executar 1 docker build 2 -f Dockerfile-production 3 -t username/image 4 ./container/ 5 docker push username/image 6 docker run -d username/images
  • 71. Globalcode – Open4education "Quando o relógio bate as seis, todas as caveiras jogam xadrez." Tumbalacatumba tumba tá, tumbalacatumba tumba tá
  • 72. Globalcode – Open4education VI - Processos Executar a aplicação com um ou mais processos
  • 73. Globalcode – Open4education VI - Processos Executar a aplicação com um ou mais processos A aplicação não deve guardar estado
  • 74. Globalcode – Open4education VI - Processos Executar a aplicação com um ou mais processos A aplicação não deve guardar estado Dados devem ser persistidos e recuperados de serviços de apoio
  • 75. Globalcode – Open4education VI - Processos Executar a aplicação com um ou mais processos A aplicação não deve guardar estado Dados devem ser persistidos e recuperados de serviços de apoio Não devem ser daemon ou ter arquivo PID, deve trabalhar com o ambiente (upstart)
  • 76. Globalcode – Open4education VI - Processos E no Docker? Cada contêiner tem seu processo único
  • 77. Globalcode – Open4education VI - Processos E no Docker? Cada contêiner tem seu processo único Pode ser adicionado processos aos contêineres
  • 78. Globalcode – Open4education VI - Processos 1 # docker-compose.yml 2 redis: 3 image: redis:2.8 4 ports: 5 - "6379:6379" 6 entrypoint: ["redis-server"] 7 command: ["--appendonly", "yes"]
  • 79. Globalcode – Open4education VI - Processos 8 php: 9 image: php:7-fpm 10 links: 11 - “redis:redis.local" 12 ports: 13 - "9000:9000" 14 entrypoint: ["php-fpm"]
  • 80. Globalcode – Open4education "Quando o relógio bate as sete, todas as caveiras jogam basquete." Tumbalacatumba tumba tá, tumbalacatumba tumba tá
  • 81. Globalcode – Open4education VII - Vínculo de portas Exportar os serviços através do vínculo de portas
  • 82. Globalcode – Open4education VII - Vínculo de portas Exportar os serviços através do vínculo de portas Cada app deve escutar e receber as requisições em sua porta
  • 83. Globalcode – Open4education VII - Vínculo de portas Exportar os serviços através do vínculo de portas Cada app deve escutar e receber as requisições em sua porta E no Docker? Cada container pode exportar uma porta e o vínculo é feito em uma porta do host
  • 84. Globalcode – Open4education VII - Vínculo de portas Exportar os serviços através do vínculo de portas Cada app deve escutar e receber as requisições em sua porta E no Docker? Cada container pode exportar uma porta e o vínculo é feito em uma porta do host Podemos escolher qual porta do host será vinculada ao container
  • 85. Globalcode – Open4education VII - Vínculo de portas 1 # docker-compose.yml 2 web: 3 image: wfsilva/nginx-php7 4 ports: 5 - "80" 6 - "443" 7 - "172.16.0.10:8000:8000"
  • 86. Globalcode – Open4education "Quando o relógio bate as oito, todas as caveiras comem biscoito.” Tumbalacatumba tumba tá, tumbalacatumba tumba tá
  • 87. Globalcode – Open4education VIII - Concorrência Escalar com base no processo usado como modelo
  • 88. Globalcode – Open4education VIII - Concorrência Escalar com base no processo usado como modelo Processos podem ser web ou workers
  • 89. Globalcode – Open4education VIII - Concorrência Escalar com base no processo usado como modelo Processos podem ser web ou workers Mais processos em paralelo, mais requisições são respondidas ou mais rápido terminam processamentos em lote.
  • 90. Globalcode – Open4education VIII - Concorrência E no Docker? Podemos escalar a quantidade de contêineres que executam uma tarefa.
  • 91. Globalcode – Open4education VIII - Concorrência 1 docker-compose scale web=34 worker=23 2 docker-compose scale web=1 worker=1
  • 92. Globalcode – Open4education "Quando o relógio bate as nove, todas as caveiras se sacodem." Tumbalacatumba tumba tá, tumbalacatumba tumba tá
  • 93. Globalcode – Open4education IX - Descartabilidade Maximizar robustez
  • 94. Globalcode – Open4education IX - Descartabilidade Maximizar robustez Inicialização rápida e desligamento normal e suave (gracefully shutdown)
  • 95. Globalcode – Open4education IX - Descartabilidade Maximizar robustez Inicialização rápida e desligamento normal e suave (gracefully shutdown) Processos do app são descartáveis
  • 96. Globalcode – Open4education IX - Descartabilidade Maximizar robustez Inicialização rápida e desligamento normal e suave (gracefully shutdown) Processos do app são descartáveis Facilita escalonamento rápido e elástico
  • 97. Globalcode – Open4education IX - Descartabilidade Maximizar robustez Inicialização rápida e desligamento normal e suave (gracefully shutdown) Processos do app são descartáveis Facilita escalonamento rápido e elástico Evitar desligamento repentino (crash)
  • 98. Globalcode – Open4education IX - Descartabilidade E no Docker? Trocar uma configuração de um contêiner, subir novos e desligar os antigos
  • 99. Globalcode – Open4education IX - Descartabilidade E no Docker? Trocar uma configuração de um contêiner, subir novos e desligar os antigos Em um Swarm quando um nó cai os containers são reorganizados nos demais nós.
  • 100. Globalcode – Open4education IX - Descartabilidade 1 docker run -d -P 2 --memory=512M 3 --name webserver 4 nginx 5 docker update --memory=1G webserver
  • 101. Globalcode – Open4education "Quando o relógio bate as dez, todas as caveiras comem pastéis." Tumbalacatumba tumba tá, tumbalacatumba tumba tá
  • 102. Globalcode – Open4education X - Paridade Dev/Prod Manter os ambientes mais similares (desenvolvimento, homologação, produção)
  • 103. Globalcode – Open4education X - Paridade Dev/Prod Manter os ambientes mais similares (desenvolvimento, homologação, produção) Minimizar a lacuna de tempo (deploy em horas ou minutos)
  • 104. Globalcode – Open4education X - Paridade Dev/Prod Manter os ambientes mais similares (desenvolvimento, homologação, produção) Minimizar a lacuna de tempo (deploy em horas ou minutos) Minimizar a lacuna de pessoal (devs codam, ops fazem deploy)
  • 105. Globalcode – Open4education X - Paridade Dev/Prod Manter os ambientes mais similares (desenvolvimento, homologação, produção) Minimizar a lacuna de tempo (deploy em horas ou minutos) Minimizar a lacuna de pessoal (devs codam, ops fazem deploy) Minimizar a lacuna de ferramentas (Dev com OSX, Nginx 1.2.1, PHP 7.0.3 e MySQL 5.6 - Prod com Nginx 1.9, PHP 5.5.33 e Percona 5.6)
  • 106. Globalcode – Open4education X - Paridade Dev/Prod E no Docker? Os contêineres que rodam em dev tem as mesmas versões das instâncias em produção
  • 107. Globalcode – Open4education X - Paridade Dev/Prod 1 percona: 2 image: percona:5.6 3 ports: 4 - "3306:3306" 5 environment: 6 - "MYSQL_ROOT_PASSWORD=senha" 7 - "MYSQL_DATABASE=db"
  • 108. Globalcode – Open4education X - Paridade Dev/Prod 8 rabbit: 9 image: rabbitmq:3-management 10 ports: 11 - "5672:5672" 12 - "15672:15672" 13 environment: 14 - "TERM=linux" 15 - "RABBITMQ_NODENAME=rabbit" 16 - "RABBITMQ_DEFAULT_PASS=senha" 17 - "RABBITMQ_DEFAULT_USER=admin"
  • 109. Globalcode – Open4education X - Paridade Dev/Prod 18 redis: 19 image: redis:2.8 20 ports: 21 - "6379:6379" 22 entrypoint: ["redis-server"] 23 command: ["--appendonly", "yes"] 24 memcached: 25 image: memcached:1.4 26 ports: 27 - "11211:11211"
  • 110. Globalcode – Open4education "Quando o relógio bate as onze, todas as caveiras sobem no bonde." Tumbalacatumba tumba tá, tumbalacatumba tumba tá
  • 111. Globalcode – Open4education XI - Logs Logs como fluxo de eventos ordenados no tempo
  • 112. Globalcode – Open4education XI - Logs Logs como fluxo de eventos ordenados no tempo O app escreve os eventos no fluxo stdout
  • 113. Globalcode – Open4education XI - Logs Logs como fluxo de eventos ordenados no tempo O app escreve os eventos no fluxo stdout Em dev os logs são consultados acessando os arquivos
  • 114. Globalcode – Open4education XI - Logs Logs como fluxo de eventos ordenados no tempo O app escreve os eventos no fluxo stdout Em dev os logs são consultados acessando os arquivos Em homolog e produção são capturados em roteadores tipo fluent, logplex, logstash
  • 115. Globalcode – Open4education XI - Logs Logs como fluxo de eventos ordenados no tempo O app escreve os eventos no fluxo stdout Em dev os logs são consultados acessando os arquivos Em homolog e produção são capturados em roteadores tipo fluent, logplex, logstash Busca e apresentação de logs com ferramentas tipo ELK (Elastic Search, Logstash e Kibana)
  • 116. Globalcode – Open4education XI - Logs E o Docker? Containers tem drivers de log
  • 117. Globalcode – Open4education XI - Logs E o Docker? Containers tem drivers de log Suporte a json-file, syslog, journald, gelf, fluentd, awslogs e splunk
  • 118. Globalcode – Open4education XI - Logs 1 docker run 2 --log-driver=fluentd 3 --log-opt fluentd-address=localhost:24224 4 --log-opt tag=docker.{{.Name}}
  • 119. Globalcode – Open4education "Quando o relógio bate as doze, todas as caveiras fazem pose" Tumbalacatumba tumba tá, tumbalacatumba tumba tá
  • 120. Globalcode – Open4education XII - Processos Administrativos Tarefas administrativas são como processos pontuais
  • 121. Globalcode – Open4education XII - Processos Administrativos Tarefas administrativas são como processos pontuais Tem que rodar no mesmo codebase
  • 122. Globalcode – Open4education XII - Processos Administrativos Tarefas administrativas são como processos pontuais Tem que rodar no mesmo codebase Executar em ambiente idêntico
  • 123. Globalcode – Open4education XII - Processos Administrativos Tarefas administrativas são como processos pontuais Tem que rodar no mesmo codebase Executar em ambiente idêntico Migrações de banco
  • 124. Globalcode – Open4education XII - Processos Administrativos Tarefas administrativas são como processos pontuais Tem que rodar no mesmo codebase Executar em ambiente idêntico Migrações de banco Scripts de rotinas
  • 125. Globalcode – Open4education XII - Processos Administrativos Docker Técnica de conteinerização de comandos
  • 126. Globalcode – Open4education XII - Processos Administrativos Docker Técnica de conteinerização de comandos Adicionar processo ao contêiner com docker exec
  • 127. Globalcode – Open4education XII - Processos Administrativos 1 # subindo o server 2 docker run --name db -d -P 3 --env "MYSQL_ROOT_PASSWORD=senha" 4 --env "MYSQL_DATABASE=banco" 5 percona
  • 128. Globalcode – Open4education XII - Processos Administrativos 6 # rodando o client 7 docker run -it 8 --link db:db 9 --rm percona 10 sh -c 'exec mysql -h"$MYSQL_PORT_3306_TCP_ADDR" 
 11 -P"$MYSQL_PORT_3306_TCP_PORT" -uroot 12 -p"$MYSQL_ENV_MYSQL_ROOT_PASSWORD"'
  • 129. Globalcode – Open4education XII - Processos Administrativos 1 # exemplo docker exec 2 docker exec -it phpcontainer /usr/bin/top
  • 130. Globalcode – Open4education Concluindo Não são regras, são sugestões de boas práticas
  • 131. Globalcode – Open4education Concluindo Não são regras, são sugestões de boas práticas Os 12 fatores não farão sua aplicação melhor
  • 132. Globalcode – Open4education Concluindo Não são regras, são sugestões de boas práticas Os 12 fatores não farão sua aplicação melhor Os 12 fatores vão trazer a facilidade de trabalhar com sua aplicação em ambientes de cloud
  • 133. Globalcode – Open4education Concluindo Não são regras, são sugestões de boas práticas Os 12 fatores não farão sua aplicação melhor Os 12 fatores vão trazer a facilidade de trabalhar com sua aplicação em ambientes de cloud Docker tem uma grande aderência aos 12 fatores
  • 134. Globalcode – Open4education Slides & Feedback https://joind.in/talk/0a473 https://speakerdeck.com/wsilva