Share
Embed
Aplicações 12 fatores, melhor com Docker
Palestra sobre os 12 fatores e a aderência do Docker ministrada no TDC (The Developers Conference) em São Paulo em 8/7/2016.
Wellington F. Silva
July 08, 2016
Transcript
134 slides
-
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? 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 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? 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 "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 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 [email protected]:usuario/ repo.git 7 git push -u origin master -
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 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 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 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 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 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