122
Aplicações 12 fatores Melhor com Docker

12 factor app. Melhor com Docker

Embed Size (px)

Citation preview

Aplicações 12 fatoresMelhor com Docker

wsilva/tom/boina● Devops na GFG

● @_wsilva

Agenda

● O que é Docker?● O que é 12 factor app?● Os 12 fatores● Como o Docker adere a cada fator

O que é Docker?

O que é Docker?

● Sistema de contêineres Linux

O que é Docker?

● Sistema de contêineres Linux● Muito leve e rápido

O que é Docker?

● Sistema de contêineres Linux● Muito leve e rápido● Muitas vantagens em relação à virtualização

O que é Docker?

● Sistema de contêineres Linux● Muito leve e rápido● Muitas vantagens em relação à virtualização● Build, Ship, Run anywhere

O que é Docker?

● Sistema de contêineres Linux● Muito leve e rápido● Muitas vantagens em relação à virtualização● Build, Ship, Run anywhere● Tem ferramentas para orquestração

O que é Docker?

● Sistema de contêineres Linux● Muito leve e rápido● Muitas vantagens em relação à virtualização● Build, Ship, Run anywhere● Tem ferramentas para orquestração ● Tem ferramentas para clusterização

O que é Docker?

● Sistema de contêineres Linux● Muito leve e rápido● Muitas vantagens em relação à virtualização● Build, Ship, Run anywhere● Tem ferramentas para orquestração ● Tem ferramentas para clusterização● Criado por Solomon Hykes

O que é Docker?

● Sistema de contêineres Linux● Muito leve e rápido● Muitas vantagens em relação à virtualização● Build, Ship, Run anywhere● Tem ferramentas para orquestração ● Tem ferramentas para clusterização● Criado por Solomon Hykes● Open Source

O que é Docker?

● Sistema de contêineres Linux● Muito leve e rápido● Muitas vantagens em relação à virtualização● Build, Ship, Run anywhere● Tem ferramentas para orquestração ● Tem ferramentas para clusterização● Criado por Solomon Hykes● Open Source● http://www.docker.com

O que é 12 factor app?

O que é 12 factor app?

● Metodologia para desenvolvimento de apps web e SAAS (Software as a Service)

O que é 12 factor app?

● Metodologia para desenvolvimento de apps web e SAAS (Software as a Service)

● Aplicável em qualquer linguagem de programação de alto nível

O que é 12 factor app?

● Metodologia para desenvolvimento de apps web e SAAS (Software as a Service)

● Aplicável em qualquer linguagem de programação de alto nível

● Facilita portabilidade e escalabilidade

O que é 12 factor app?

● Metodologia para desenvolvimento de apps web e SAAS (Software as a Service)

● 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

O que é 12 factor app?

● Metodologia para desenvolvimento de apps web e SAAS (Software as a Service)

● 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 problemas sistêmicos comuns

O que é 12 factor app?

● Metodologia para desenvolvimento de apps web e SAAS (Software as a Service)

● 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 problemas sistêmicos comuns● Inspirado no "Patterns of Enterprise Application

Architecture" e no "Refactoring" de Martin Fowler

O que é 12 factor app?

● Metodologia para desenvolvimento de apps web e SAAS (Software as a Service)

● 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 problemas sistêmicos comuns● Inspirado no "Patterns of Enterprise Application

Architecture" e no "Refactoring" de Martin Fowler● http://12factor.net

"Quando o relógio bate a uma,todas as caveiras saem das tumbas."Tumbalacatumba tumba tá, tumbalacatumba tumba tá

I - Base de Código

● Repositório único por app (git, hg, svn, bazaar)

I - Base de Código

● Repositório único por app (git, hg, svn, bazaar)● + de um codebase é um sistema distribuído

I - Base de Código

● Repositório único por app (git, hg, svn, bazaar)● + de um codebase é um sistema distribuído● Mais apps num mesmo codebase é errado

I - Base de Código

● 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)

I - Base de Código

● 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)

Docker:

● Colocar Dockerfiles no repositório

I - Base de Código

1 cd 12factor 2 git init . 3 git add web-container/Dockerfile 4 git add wer-source/* 5 git commit -m "Iniciando os trabalhos"

"Quando o relógio bate as duas,todas as caveiras pintam as unhas."Tumbalacatumba tumba tá, tumbalacatumba tumba tá

II - Dependências

● Devem ser declaradas e isoladas

II - Dependências

● Devem ser declaradas e isoladas● Devem estar presentes em um arquivo manifesto (composer.json,

requirements.txt, Gemfile)

II - Dependências

● Devem ser declaradas e isoladas● Devem estar presentes em um arquivo manifesto (composer.json,

requirements.txt, Gemfile)● Utilizar ferramentas de empacotamento (composer, pip, maven, bundle)

II - Dependências

● Devem ser declaradas e isoladas● Devem estar presentes em um arquivo manifesto (composer.json,

requirements.txt, Gemfile)● Utilizar ferramentas de empacotamento (composer, pip, maven, bundle)● Dependencias de recursos de SO devem ser vendorizadas em um novo app

II - Dependências

● Devem ser declaradas e isoladas● Devem estar presentes em um arquivo manifesto (composer.json,

requirements.txt, Gemfile)● Utilizar ferramentas de empacotamento (composer, pip, maven, bundle)● Dependencias de recursos de SO devem ser vendorizadas em um novo app● Mudanças são rapidamente detectadas na construção

II - Dependências

● Devem ser declaradas e isoladas● Devem estar presentes em um arquivo manifesto (composer.json,

requirements.txt, Gemfile)● Utilizar ferramentas de empacotamento (composer, pip, maven, bundle)● Dependencias de recursos de SO devem ser vendorizadas em um novo app● Mudanças são rapidamente detectadas na construção

Docker

● Dependências ficam explícitas no Dockerfile (FROM, ADD, COPY)

II - Dependências

1 FROM nginx:1.9.92 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

II - Dependências

1 ADD https://github.com/alanxz/rabbitmq-c/archive/v0.5.2.zip /rabbitmq-c-0.5.2.zip2 RUN unzip rabbitmq-c-0.5.2.zip \3 && cd rabbitmq-c-0.5.2 \4 && autoreconf -i \5 && ./configure \6 && make \7 && make install \8 && pecl install amqp \

II - Dependências

9 && echo "extension=amqp.so" > /etc/php5/mods-available/amqp.ini \10 && cd / \11 && rm rabbitmq-c-0.5.2.zip \12 && rm -rf rabbitmq-c-0.5.2

"Quando o relógio bate as três,todas as caveiras imitam chinês."Tumbalacatumba tumba tá, tumbalacatumba tumba tá

● Configurações devem ser armazenadas no ambiente

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)

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)

III - Configurações

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)

Docker

● Ao construir e ao iniciar um container podemos definir variáveis de ambiente

III - Configurações

1 export TESTING="12 factor"

III - Configurações

1 docker run -d --name web \2 --env TESTING="12 factor" nginx3 docker run -d --name backend \4 --env-file ./env-file myimage/backend5 docker run -d --name db \6 --env "MYSQL_ROOT_PASSWORD=senha" \7 --env "MYSQL_DATABASE=mydb" mysql

III - Configurações

1 <?php2 3 $var = getenv('TESTING');4 echo $var; //12 factor

"Quando o relógio bate as quatro,todas as caveiras tiram retrato."Tumbalacatumba tumba tá, tumbalacatumba tumba tá

IV - Serviços de Apoio

● Trate serviços de apoio como recursos anexados.

IV - Serviços de Apoio

● Trate serviços de apoio como recursos anexados.● São serviços consumidos via rede

IV - Serviços de Apoio

● Trate serviços de apoio como recursos anexados.● São serviços consumidos via rede● Exemplos: MySQL, Redis, Memcache, APIs, serviços de e-mail, Filas

IV - Serviços de Apoio

● Trate serviços de apoio como recursos anexados.● São serviços consumidos via rede● Exemplos: MySQL, Redis, Memcache, APIs, serviços de e-mail, Filas● Por ser anexado podemos trocar o recurso caso apresente problemas

IV - Serviços de Apoio

● Trate serviços de apoio como recursos anexados.● São serviços consumidos via rede● Exemplos: MySQL, Redis, Memcache, APIs, serviços de e-mail, Filas● Por ser anexado podemos trocar o recurso caso apresente problemas

Docker:

● Os serviços de apoio também podem ser outros containers

IV - Serviços de Apoio

1 # docker-compose.yml2 web:3 image: account/webimage4 ports:5 - "80:80"6 links:7 - "redis:redis.dev"8 - "mysql-write:mysql02.service-provider.com"9 - "mysql-read:192.168.1.77"10 redis:11 image: redis:2.8

12 hostname: redis.dev13 ports:14 - "6379:6379"15 entrypoint: ["redis-

server"]16 command: ["--

appendonly", "yes"]

IV - Serviços de Apoio

12 hostname: redis.dev13 ports:14 - "6379:6379"15 entrypoint: ["redis-server"]16 command: ["--appendonly", "yes"]

"Quando o relógio bate as cinco,todas as caveiras apertam os cintos."Tumbalacatumba tumba tá, tumbalacatumba tumba tá

V - Contruir, lançar e executar

● Separemos claramente os estágios de construção e execução

V - Contruir, lançar e executar

● Separemos claramente os estágios de construção e execução● Construção é a montagem do artefato e provisionamento de dependências

V - Contruir, lançar e executar

● Separemos claramente os estágios de construção e execução● Construção é a montagem do artefato e provisionamento de dependências● Na construção que temos que detectar problemas (testes automatizados)

V - Contruir, lançar e executar

● Separemos claramente os estágios de construção e execução● 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

V - Contruir, lançar e executar

● Separemos claramente os estágios de construção e execução● 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)

V - Contruir, lançar e executar

● Separemos claramente os estágios de construção e execução● 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

V - Contruir, lançar e executar

Docker

● No Docker temos o mote: build, ship and run anywhere

V - Contruir, lançar e executar

1 docker build \2 -f Dockerfile-production \3 -t username/image \4 ./container/5 docker push username/image6 docker run -d username/images

"Quando o relógio bate as seis,todas as caveiras jogam xadrez."Tumbalacatumba tumba tá, tumbalacatumba tumba tá

● Executar a aplicação com um ou mais processos

VI - Processos

● Executar a aplicação com um ou mais processos● A aplicação não deve guardar estado

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

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)

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)

Docker

● Cada contêiner tem seu processo único

VI - Processos

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)

Docker

● Cada contêiner tem seu processo único● Pode ser adicionado processos aos contêineres

VI - Processos

1 # docker-compose.yml2 redis:3 image: redis:2.84 ports:5 - "6379:6379"6 entrypoint: ["redis-server"]7 command: ["--appendonly", "yes"]

"Quando o relógio bate as sete,todas as caveiras jogam basquete."Tumbalacatumba tumba tá, tumbalacatumba tumba tá

● Exportar os serviços através do vínculo de portas

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

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

Docker

● Cada container pode exportar uma porta e o vínculo é feito em uma porta do host

VII - Vínculo de portas

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

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

VII - Vínculo de portas

1 # docker-compose.yml2 web:3 image: username/webimage4 ports:5 - "80"6 - "443"7 - "8000:8000"

"Quando o relógio bate as oito,todas as caveiras comem biscoito."Tumbalacatumba tumba tá, tumbalacatumba tumba tá

● Escalar com base no processo usado como modelo

VIII - Concorrência

● Escalar com base no processo usado como modelo● Processos podem ser web ou workers

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.

VIII - Concorrência

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.

Docker

● Podemos escalar a quantidade de contêineres que executam uma tarefa.

VIII - Concorrência

1 docker-compose scale web=5 worker=32 docker-compose scale web=1 worker=1

"Quando o relógio bate as nove,todas as caveiras se sacodem."Tumbalacatumba tumba tá, tumbalacatumba tumba tá

● Maximizar robustez

IX - Descartabilidade

● Maximizar robustez● Inicialização rápida e desligamento normal e suave (gracefull shutdown)

IX - Descartabilidade

● Maximizar robustez● Inicialização rápida e desligamento normal e suave (gracefull shutdown)● Processos do app são descartáveis

IX - Descartabilidade

● Maximizar robustez● Inicialização rápida e desligamento normal e suave (gracefull shutdown)● Processos do app são descartáveis● Facilita escalonamento rápido e elástico

IX - Descartabilidade

● Maximizar robustez● Inicialização rápida e desligamento normal e suave (gracefull shutdown)● Processos do app são descartáveis● Facilita escalonamento rápido e elástico● Evitar desligamento repentino (crash)

IX - Descartabilidade

IX - Descartabilidade

● Maximizar robustez● Inicialização rápida e desligamento normal e suave (gracefull shutdown)● Processos do app são descartáveis● Facilita escalonamento rápido e elástico● Evitar desligamento repentino (crash)

Docker:

● Trocar uma configuração de um contêiner, subir novos e desligar os antigos

IX - Descartabilidade

● Maximizar robustez● Inicialização rápida e desligamento normal e suave (gracefull shutdown)● Processos do app são descartáveis● Facilita escalonamento rápido e elástico● Evitar desligamento repentino (crash)

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

IX - Descartabilidade

1 docker run -d -P \2 --memory=512M \3 --name webserver \4 nginx5 docker update --memory=1G webserver

"Quando o relógio bate as dez,todas as caveiras comem pastéis."Tumbalacatumba tumba tá, tumbalacatumba tumba tá

● Manter os ambientes mais similares (desenvolvimento, homologação, produção)

X - Paridade Dev/Prod

● Manter os ambientes mais similares (desenvolvimento, homologação, produção)

● Minimizar a lacuna de tempo (deploy em horas ou minutos)

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)

X - Paridade Dev/Prod

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)

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)

Docker:

● Os contêineres que rodam em dev tem as mesmas versões das instâncias em produção

1 percona:2 image: percona:5.63 ports:4 - "3306:3306"5 environment:6 - "MYSQL_ROOT_PASSWORD=senha"7 - "MYSQL_DATABASE=db"

X - Paridade Dev/Prod

X - Paridade Dev/Prod

8 rabbit:9 image: rabbitmq:3-management10 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"

X - Paridade Dev/Prod

18 redis:19 image: redis:2.820 ports:21 - "6379:6379"22 entrypoint: ["redis-server"]23 command: ["--appendonly", "yes"]24 memcached:25 image: memcached:1.426 ports:27 - "11211:11211"

"Quando o relógio bate as onze,todas as caveiras sobem no bonde."Tumbalacatumba tumba tá, tumbalacatumba tumba tá

● Logs como fluxo de eventos ordenados no tempo

XI - Logs

● Logs como fluxo de eventos ordenados no tempo● O app escreve os eventos no fluxo stdout

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

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

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)

XI - Logs

XI - Logs

Docker

● Containers tem drivers de log

XI - Logs

Docker

● Containers tem drivers de log● Suporte a json-file, syslog, journald, gelf, fluentd, awslogs e splunk

XI - Logs

1 docker run \2 --log-driver=fluentd \3 --log-opt fluentd-address=localhost:24224 \4 --log-opt tag=docker.{{.Name}}

"Quando o relógio bate as doze,todas as caveiras fazem pose"Tumbalacatumba tumba tá, tumbalacatumba tumba tá

● Tarefas administrativas são como processos pontuais

XII - Processos Administrativos

● Tarefas administrativas são como processos pontuais● Mesmo codebase

XII - Processos Administrativos

● Tarefas administrativas são como processos pontuais● Mesmo codebase● Executar em ambiente idêntico

XII - Processos Administrativos

● Tarefas administrativas são como processos pontuais● Mesmo codebase● Executar em ambiente idêntico● Migrações de banco

XII - Processos Administrativos

● Tarefas administrativas são como processos pontuais● Mesmo codebase● Executar em ambiente idêntico● Migrações de banco● Scripts de rotinas

XII - Processos Administrativos

● Tarefas administrativas são como processos pontuais● Mesmo codebase● Executar em ambiente idêntico● Migrações de banco● Scripts de rotinas

Docker

● Técnica de conteinerização de comandos

XII - Processos Administrativos

XII - Processos Administrativos

● Tarefas administrativas são como processos pontuais● Mesmo codebase● Executar em ambiente idêntico● Migrações de banco● Scripts de rotinas

Docker

● Técnica de conteinerização de comandos● Adicionar processo ao contêiner com docker exec

XII - Processos Administrativos

1 # subindo o server2 docker run --name db -d -P \3 --env "MYSQL_ROOT_PASSWORD=senha" \4 --env "MYSQL_DATABASE=banco" \5 percona

XII - Processos Administrativos

6 # rodando o client7 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 -p"$MYSQL_ENV_MYSQL_ROOT_PASSWORD"'

Q&A

https://joind.in/talk/91f92

https://speakerdeck.com/wsilva

Slides & Feedback