2. Globalcode – Open4education
Wellington F. Silva
a.k.a.: wsilva/tom/boina
técnico em telecom,
programador, devops,
instrutor, escritor, pai
Atualmente na GFG
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?
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
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
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
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
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á
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
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á
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)
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
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.
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.
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
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)
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}}
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
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"'
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