SlideShare une entreprise Scribd logo
1  sur  66
Télécharger pour lire hors ligne
Dockerizando aplicações em
uma Fintech
O bom, o mau e o feio/as surpresas
Rafael Gomes
Pai de um menino
DevOps Engineer #PayCertify
Soteropolitano
Docker Captain
Membro do Core Team do DevOpsDays
#devops
#docker
INICIATIVAS
Raul Hacker Club
Gatilho Kosmico: gatilhokosmico.com.br
CONTATOS
@gomex
https://gomex.me/
https://www.linkedin.com/in/rbgomes/
O que estou fazendo?
Docker para Desenvolvedores
Pague quanto quiser
Inclusive nada
Aberto
Você só precisa citar o autor
Colaborativo
https://github.com/gomex/docker-para-desenvolvedores
Link
https://leanpub.com/dockerparadesenvolvedores
O que estou fazendo?
Gatilho Kosmico
Um podcast diverso
A ideia é unir conhecimentos
Tem um programa sobre DevOps
"DevOps é cargo?" :)
Colaborativo
Tem alguma sugestão?
Onde baixar
http://gatilhokosmico.com.br
Não é gatinho cósmico, ok? :P
Comunidades
Minhas dicas
DevOpsBR
https://t.me/devopsbr
DockerBR
https://t.me/dockerbr
Ansible
https://t.me/ansiblebr
Terraform
https://t.me/terraformbr
A Fintech
Ecossistema de pagamento
100+ clientes
Processa 50m dólares mês
20 desenvolvedores
10+ APIs
4 anos de empresa
O desafio
Transformar em imagem
docker uma aplicação escrita
em Ruby on Rails.
Web Worker
- Usa NodeJS
- Deploy manual no Heroku
O método
Entrega = Atender expectativas do cliente
O método - Um exemplo
Dockerizar uma
app
Ambiente Prod
Ambiente QA
Ambiente só de
dev
Entregue
Criar CI
Lint Entregue
Criar
artefato
Deploy
Teste
Sonar
Entregue
Primeiros passos
Entregar um ambiente de
desenvolvimento
automatizado e
padronizado
1
Entendendendo as
demandas de Dev
1. Não pode demorar o build da imagem
2. Possibilidade de manter cache de instalação
de gems
3. Possibilidade de debugar o código da gem
4. Armazenar histórico irbrc
5. Precisa automatizar o primeiro uso (db
creation, migration e etc)
6. Usuário diferente de root
Exemplo do Dockerfile
FROM ruby:2.5.1 as builder
RUN curl -sL
https://deb.nodesource.com/setup_8.x |
bash - &&
curl -sS
https://dl.yarnpkg.com/debian/pubkey.g
pg | apt-key add - &&
echo "deb
https://dl.yarnpkg.com/debian/ stable
main" | tee
/etc/apt/sources.list.d/yarn.list
ARG NODE_DATE_INSTALL=20180710
RUN apt-get update 
&& apt-get install -y locales 
graphviz 
imagemagick 
postgresql-client-9.6 
yarn 
nodejs 
&& echo "en_US.UTF-8 UTF-8" >
/etc/locale.gen && /usr/sbin/locale-gen
&&
rm -rf /var/lib/apt/lists/*
… continuação do Dockerfile
ARG BUNDLE_GITHUB__COM
ENV BUNDLE_GITHUB__COM 
$BUNDLE_GITHUB__COM
ENV GEM_HOME /gems/vendor
ENV GEM_PATH /gems/vendor
ENV GEM_SPEC_CACHE /gems/specs
ENV BUNDLE_PATH /gems/vendor
ENV BUNDLE_BIN /gems/vendor/bin
ENV PATH 
/app/bin:/gems/vendor/bin:$PATH
ARG RAILS_ENV
ENV RAILS_ENV=$RAILS_ENV
ENV APP_ROOT /app
WORKDIR $APP_ROOT/
RUN mkdir -p /gems
RUN groupadd -r app 
&& groupmod -g 1000 app 
&& useradd -g app -ms /bin/bash app 
&& chown app $APP_ROOT 
&& chown -R app /gems
USER app
Exemplo do docker-compose
version: '3.4'
services:
app:
working_dir: $PWD
build:
context: .
target: builder
args:
BUNDLE_GITHUB__COM: $BUNDLE_GITHUB__COM
RAILS_ENV: development
…continuação do docker-compose
image: app:development
env_file:
- ./.env
command: bundle exec rails server -b 0.0.0.0
volumes:
- ./utils_ruby:/utils_ruby
- .:$PWD
- gems_2_5_1:/gems
- app_home:/home/app/
- .irbrc:/home/app/.irbrc
ports:
- 3010:3000
depends_on:
- mailcatcher
- postgres
- redis
1. Não pode demorar o build da imagem
2. Possibilidade de manter cache de instalação
de gems
3. Possibilidade de debugar o código da gem
4. Armazenar histórico irbrc
5. Precisa automatizar o primeiro uso (db
creation, migration e etc)
6. Usuário diferente de root
Exemplo do Makefile
dev: ## Start complete app dev environment
docker-compose up --build
dev-first: ## Start complete app dev environment
docker-compose rm -f
docker-compose build
docker-compose run app bundle install --gemfile=Gemfile
docker-compose run app yarn install
docker-compose run app rails db:drop
docker-compose run app rails db:create db:migrate db:seed
docker-compose stop
1. Não pode demorar o build da imagem
2. Possibilidade de manter cache de instalação
de gems
3. Possibilidade de debugar o código da gem
4. Armazenar histórico irbrc
5. Precisa automatizar o primeiro uso (db
creation, migration e etc)
6. Usuário diferente de root
Criando CI
Entregar as melhores
práticas de um pipeline de
entrega de imagens docker
como artefato
2
Pipeline completo até QA
Precisamos incluir o conceito
de lint no CI
Exemplo do Jenkinsfile
stages {
stage('lint') {
agent {
docker { image 'paycertify/docker-lint:v2' }
}
steps {
sh 'dockerfile_lint -f Dockerfile -r
/rules/default_rules.yaml'
}
}
Exemplo do Dockerfile do Docker-lint
FROM projectatomic/dockerfile-lint:latest
LABEL maintainer "Rafael Gomes
<rafael.gomes@paycertify.com>"
COPY default_rules.yaml /rules/default_rules.yaml
Exemplo do default_rules do Docker-lint
required_instructions:
-
instruction: "EXPOSE"
count: 1
level: "info"
message: "There is no 'EXPOSE' instruction"
description: "Without exposed ports how will the service be accessed?"
reference_url:
- "https://docs.docker.com/engine/reference/builder/"
- "#expose"
Resultado do lint no pipeline
O teste precisa de Banco
Exemplo do Jenkinsfile
stage('test') {
steps {
sh 'make dev-first'
sh 'make rspec-test'
sh 'make db-drop'
}
}
Exemplo do Makefile
dev-first: ## Start complete app dev environment
docker-compose rm -f
docker-compose build
docker-compose run app bundle install --gemfile=Gemfile
docker-compose run app yarn install
docker-compose run app rails db:drop
docker-compose run app rails db:create db:migrate db:seed
docker-compose stop
...Continuação do Makefile
rspec-test: ## Run rspec test
docker-compose rm -f
docker-compose build
docker-compose run app rspec .
docker-compose stop
db-drop: ## Drop DB
docker-compose rm -f
docker-compose build
docker-compose run app rails db:drop
docker-compose stop
Resultado do rspec no pipeline
Uma imagem docker apenas!
Dockerfile MultiStage Build
FROM ruby:2.5.1 as builder
…
FROM builder as install
<Copia gemfile e package.json para instalar pacotes nodes e gems>
FROM install as preprod
<Copia o código e compila os assets do node>
Dockerfile MultiStage Build
FROM paycertify/ruby:2.5.1-slim as prod
...
WORKDIR /app/
...
COPY --from=preprod /usr/local/bundle/ /usr/local/bundle/
COPY --from=preprod /app/ /app/
COPY --from=preprod /gems/ /gems/
EXPOSE 3000
CMD ["bundle","exec","rails","server","-b","0.0.0.0"]
Exemplo do Jenkinsfile
stage('build') {
steps {
script {
sh "make qa-build"
println "Newly generated app image"
}
}
}
Makefile
qa-build: ## Build QA image
docker build -t app:$(GIT_COMMIT) --target prod .
Aplicando tag e mandando
pra Heroku
Exemplo do Jenkinsfile
stage('tag-push-qa') {
when {
branch "staging"
}
steps {
script {
sh 'make heroku-tag-qa'
}
}
}
Makefile
heroku-tag-qa: docker-heroku-login ## Tag QA image
docker tag app:$(GIT_COMMIT) registry.heroku.com/app/web
docker tag worker:$(GIT_COMMIT) registry.heroku.com/app/worker
docker push registry.heroku.com/app/web
docker push registry.heroku.com/app/worker
# HELPERS
docker-heroku-login: ## Auto login to Heroku Docker Registry
docker login --username=_ --password=$(API_KEY) registry.heroku.com
Fazendo deploy no heroku
Exemplo do Jenkinsfile
stage('deploy-heroku-qa') {
when {
branch "staging"
}
steps {
sh 'make heroku-release-qa'
}
}
Makefile
heroku-release-qa: ## Release QA image
heroku container:release --app app web
heroku run -a app rails db:migrate
A aplicação precisa ser
testada end-to-end
(capybara)
Exemplo do Jenkinsfile
stage('QA e2e test') {
when {
branch "staging"
}
steps {
script {
sh 'make e2e_test'
}
}
}
Makefile
e2e_test: ## Start complete app QA environment
docker run --rm -e URL_STAGING=$$URL_STAGING -e
EMAIL_ADMIN=$$EMAIL_ADMIN -e
EMAIL_MERCHANT=$$EMAIL_MERCHANT -e
PASSWORD=$$PASSWORD -e HUB=$$HUB -v
$$PWD/test/e2e_tests:/test paycertify/capybara:0.4
Pipeline completo até QA
Obtendo feedback
A solução proposta atende
às expectativas dos
desenvolvedores?
Lembre-se nosso objetivo
aqui é isso!
3
Cada passo, cada mudança
no projeto foi revisada e
aceita o PR por ao menos um
pessoa do time de dev
Parear com o time de dev e
obter experiência
Deploy em produção
A janela de mudança
precisa ser a menor
possível
4
Um backup e restore do
banco de produção manual
para o ambiente
automatizado é necessário
Exemplo de comandos do Heroku
heroku pg:backups:download b001 --app manual-prod-app
heroku pg:backups:restore latest.dump --app auto-prod-app
Obrigado!
Rafael Gomes
Pai de um menino
DevOps Engineer #PayCertify
Soteropolitano
Docker Captain
Membro do Core Team do DevOpsDays
#devops
#docker
INICIATIVAS
Raul Hacker Club
Core team do DevOpsDays
CONTATOS
@gomex
https://gomex.me/
https://www.linkedin.com/in/rbgomes/

Contenu connexe

Tendances

Docker como super comando
Docker como super comandoDocker como super comando
Docker como super comandoRafael Gomes
 
Deploying Docker Containers
Deploying Docker ContainersDeploying Docker Containers
Deploying Docker ContainersHugo Henley
 
Orquestrando Docker Containers: Machine, Swarm e Compose
Orquestrando Docker Containers: Machine, Swarm e ComposeOrquestrando Docker Containers: Machine, Swarm e Compose
Orquestrando Docker Containers: Machine, Swarm e ComposeRoberto Hashioka
 
Trabalhando com a infraestrutura como software na AWS com Elastic Beanstalk e...
Trabalhando com a infraestrutura como software na AWS com Elastic Beanstalk e...Trabalhando com a infraestrutura como software na AWS com Elastic Beanstalk e...
Trabalhando com a infraestrutura como software na AWS com Elastic Beanstalk e...Bruno Rodrigues
 
TDC2018SP | Trilha Containers - Linux Conteineres na unha
TDC2018SP | Trilha Containers - Linux Conteineres na unhaTDC2018SP | Trilha Containers - Linux Conteineres na unha
TDC2018SP | Trilha Containers - Linux Conteineres na unhatdc-globalcode
 
Docker para Desenvolvedores - Developers-BR - Julho-2018
Docker para Desenvolvedores - Developers-BR - Julho-2018Docker para Desenvolvedores - Developers-BR - Julho-2018
Docker para Desenvolvedores - Developers-BR - Julho-2018Renato Groff
 
DevOps na prática - Savanna Denega
DevOps na prática - Savanna DenegaDevOps na prática - Savanna Denega
DevOps na prática - Savanna DenegaSavanna Denega
 
Testadores 2015 - O Fantástico Mundo de Docker
Testadores 2015 - O Fantástico Mundo de DockerTestadores 2015 - O Fantástico Mundo de Docker
Testadores 2015 - O Fantástico Mundo de DockerStefan Teixeira
 
Meetup DevOps Carioca - GoCD + Docker + Docker Compose: uma história de amor
Meetup DevOps Carioca - GoCD + Docker + Docker Compose: uma história de amorMeetup DevOps Carioca - GoCD + Docker + Docker Compose: uma história de amor
Meetup DevOps Carioca - GoCD + Docker + Docker Compose: uma história de amorStefan Teixeira
 
Docker para Desenvolvedores - Developers-BR - Agosto-2018
Docker para Desenvolvedores - Developers-BR - Agosto-2018Docker para Desenvolvedores - Developers-BR - Agosto-2018
Docker para Desenvolvedores - Developers-BR - Agosto-2018Renato Groff
 
TDC2018SP | Trilha Containers - Provisionando um cluster Kubernetes multi-mas...
TDC2018SP | Trilha Containers - Provisionando um cluster Kubernetes multi-mas...TDC2018SP | Trilha Containers - Provisionando um cluster Kubernetes multi-mas...
TDC2018SP | Trilha Containers - Provisionando um cluster Kubernetes multi-mas...tdc-globalcode
 
Docker: Primeiros Passos, Dicas e Truques no Gerenciamento de Containers - Se...
Docker: Primeiros Passos, Dicas e Truques no Gerenciamento de Containers - Se...Docker: Primeiros Passos, Dicas e Truques no Gerenciamento de Containers - Se...
Docker: Primeiros Passos, Dicas e Truques no Gerenciamento de Containers - Se...Renato Groff
 
TDC2018SP | Trilha Containers - Kubernetes: como a magica acontece?
TDC2018SP | Trilha Containers - Kubernetes: como a magica acontece?TDC2018SP | Trilha Containers - Kubernetes: como a magica acontece?
TDC2018SP | Trilha Containers - Kubernetes: como a magica acontece?tdc-globalcode
 
#noOps?? Transcendendo o DevOps pelo caminho de tijolos (não muito) amarelos
#noOps?? Transcendendo o DevOps pelo caminho de tijolos (não muito) amarelos#noOps?? Transcendendo o DevOps pelo caminho de tijolos (não muito) amarelos
#noOps?? Transcendendo o DevOps pelo caminho de tijolos (não muito) amarelosEvandro Silvestre
 
Source-to-container no mundo real
Source-to-container no mundo realSource-to-container no mundo real
Source-to-container no mundo realEvandro Silvestre
 
Docker de ponta a ponta: do Desenvolvimento à Nuvem - Azure Talks - Agosto-2018
Docker de ponta a ponta: do Desenvolvimento à Nuvem - Azure Talks - Agosto-2018Docker de ponta a ponta: do Desenvolvimento à Nuvem - Azure Talks - Agosto-2018
Docker de ponta a ponta: do Desenvolvimento à Nuvem - Azure Talks - Agosto-2018Renato Groff
 
Monitoramento de containers Docker
Monitoramento de containers DockerMonitoramento de containers Docker
Monitoramento de containers DockerJosé Barbosa
 
Docker de ponta a ponta - do Desenvolvimento à Nuvem - .NET SP - Outubro-2018
Docker de ponta a ponta - do Desenvolvimento à Nuvem - .NET SP - Outubro-2018Docker de ponta a ponta - do Desenvolvimento à Nuvem - .NET SP - Outubro-2018
Docker de ponta a ponta - do Desenvolvimento à Nuvem - .NET SP - Outubro-2018Renato Groff
 

Tendances (20)

Docker como super comando
Docker como super comandoDocker como super comando
Docker como super comando
 
Deploying Docker Containers
Deploying Docker ContainersDeploying Docker Containers
Deploying Docker Containers
 
Orquestrando Docker Containers: Machine, Swarm e Compose
Orquestrando Docker Containers: Machine, Swarm e ComposeOrquestrando Docker Containers: Machine, Swarm e Compose
Orquestrando Docker Containers: Machine, Swarm e Compose
 
Trabalhando com a infraestrutura como software na AWS com Elastic Beanstalk e...
Trabalhando com a infraestrutura como software na AWS com Elastic Beanstalk e...Trabalhando com a infraestrutura como software na AWS com Elastic Beanstalk e...
Trabalhando com a infraestrutura como software na AWS com Elastic Beanstalk e...
 
TDC2018SP | Trilha Containers - Linux Conteineres na unha
TDC2018SP | Trilha Containers - Linux Conteineres na unhaTDC2018SP | Trilha Containers - Linux Conteineres na unha
TDC2018SP | Trilha Containers - Linux Conteineres na unha
 
Docker para Desenvolvedores - Developers-BR - Julho-2018
Docker para Desenvolvedores - Developers-BR - Julho-2018Docker para Desenvolvedores - Developers-BR - Julho-2018
Docker para Desenvolvedores - Developers-BR - Julho-2018
 
DevOps na prática - Savanna Denega
DevOps na prática - Savanna DenegaDevOps na prática - Savanna Denega
DevOps na prática - Savanna Denega
 
Testadores 2015 - O Fantástico Mundo de Docker
Testadores 2015 - O Fantástico Mundo de DockerTestadores 2015 - O Fantástico Mundo de Docker
Testadores 2015 - O Fantástico Mundo de Docker
 
Meetup DevOps Carioca - GoCD + Docker + Docker Compose: uma história de amor
Meetup DevOps Carioca - GoCD + Docker + Docker Compose: uma história de amorMeetup DevOps Carioca - GoCD + Docker + Docker Compose: uma história de amor
Meetup DevOps Carioca - GoCD + Docker + Docker Compose: uma história de amor
 
Docker para Desenvolvedores - Developers-BR - Agosto-2018
Docker para Desenvolvedores - Developers-BR - Agosto-2018Docker para Desenvolvedores - Developers-BR - Agosto-2018
Docker para Desenvolvedores - Developers-BR - Agosto-2018
 
TDC2018SP | Trilha Containers - Provisionando um cluster Kubernetes multi-mas...
TDC2018SP | Trilha Containers - Provisionando um cluster Kubernetes multi-mas...TDC2018SP | Trilha Containers - Provisionando um cluster Kubernetes multi-mas...
TDC2018SP | Trilha Containers - Provisionando um cluster Kubernetes multi-mas...
 
5. rodando containers docker na aws
5. rodando containers docker na aws5. rodando containers docker na aws
5. rodando containers docker na aws
 
Docker: Primeiros Passos, Dicas e Truques no Gerenciamento de Containers - Se...
Docker: Primeiros Passos, Dicas e Truques no Gerenciamento de Containers - Se...Docker: Primeiros Passos, Dicas e Truques no Gerenciamento de Containers - Se...
Docker: Primeiros Passos, Dicas e Truques no Gerenciamento de Containers - Se...
 
TDC2018SP | Trilha Containers - Kubernetes: como a magica acontece?
TDC2018SP | Trilha Containers - Kubernetes: como a magica acontece?TDC2018SP | Trilha Containers - Kubernetes: como a magica acontece?
TDC2018SP | Trilha Containers - Kubernetes: como a magica acontece?
 
#noOps?? Transcendendo o DevOps pelo caminho de tijolos (não muito) amarelos
#noOps?? Transcendendo o DevOps pelo caminho de tijolos (não muito) amarelos#noOps?? Transcendendo o DevOps pelo caminho de tijolos (não muito) amarelos
#noOps?? Transcendendo o DevOps pelo caminho de tijolos (não muito) amarelos
 
Source-to-container no mundo real
Source-to-container no mundo realSource-to-container no mundo real
Source-to-container no mundo real
 
Conceitos Basicos e Docker - Java Noroeste
Conceitos Basicos e Docker - Java NoroesteConceitos Basicos e Docker - Java Noroeste
Conceitos Basicos e Docker - Java Noroeste
 
Docker de ponta a ponta: do Desenvolvimento à Nuvem - Azure Talks - Agosto-2018
Docker de ponta a ponta: do Desenvolvimento à Nuvem - Azure Talks - Agosto-2018Docker de ponta a ponta: do Desenvolvimento à Nuvem - Azure Talks - Agosto-2018
Docker de ponta a ponta: do Desenvolvimento à Nuvem - Azure Talks - Agosto-2018
 
Monitoramento de containers Docker
Monitoramento de containers DockerMonitoramento de containers Docker
Monitoramento de containers Docker
 
Docker de ponta a ponta - do Desenvolvimento à Nuvem - .NET SP - Outubro-2018
Docker de ponta a ponta - do Desenvolvimento à Nuvem - .NET SP - Outubro-2018Docker de ponta a ponta - do Desenvolvimento à Nuvem - .NET SP - Outubro-2018
Docker de ponta a ponta - do Desenvolvimento à Nuvem - .NET SP - Outubro-2018
 

Similaire à Dockerizando aplicações em uma fintech o bom, o mau e o feio as surpresas

Dockerizando aplicações em uma Fintech
Dockerizando aplicações em uma FintechDockerizando aplicações em uma Fintech
Dockerizando aplicações em uma FintechRafael Gomes
 
Docker API Client with PHP and PYTHON
Docker API Client with PHP and PYTHONDocker API Client with PHP and PYTHON
Docker API Client with PHP and PYTHONIago Machado
 
Dockerizando uma aplicação NodeJS
Dockerizando uma aplicação NodeJSDockerizando uma aplicação NodeJS
Dockerizando uma aplicação NodeJSLuís Bianchin
 
Docker Swarm - Sua aplicação pronta para escalar
Docker Swarm - Sua aplicação pronta para escalarDocker Swarm - Sua aplicação pronta para escalar
Docker Swarm - Sua aplicação pronta para escalargustavomtborges
 
Construindo um data warehouse com Pentaho e Docker
Construindo um data warehouse com Pentaho e DockerConstruindo um data warehouse com Pentaho e Docker
Construindo um data warehouse com Pentaho e DockerWellington Marinho
 
Deploy Heroku
Deploy HerokuDeploy Heroku
Deploy HerokuCreditas
 
Desenvolvendo para WordPress com Docker, Git e WP-CLI
Desenvolvendo para WordPress com Docker, Git e WP-CLIDesenvolvendo para WordPress com Docker, Git e WP-CLI
Desenvolvendo para WordPress com Docker, Git e WP-CLIRudá Almeida
 
Integração Contínua com Cruise Control e phpUnderControl
Integração Contínua com Cruise Control e phpUnderControlIntegração Contínua com Cruise Control e phpUnderControl
Integração Contínua com Cruise Control e phpUnderControlDiego Tremper
 
Aplicações 12 fatores, melhor com Docker
Aplicações 12 fatores, melhor com DockerAplicações 12 fatores, melhor com Docker
Aplicações 12 fatores, melhor com DockerWellington Silva
 
Introdução ao Docker
Introdução ao DockerIntrodução ao Docker
Introdução ao DockerGeorge Moura
 
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)Wellington Silva
 
Mini-curso RubyOnRails CESOL
Mini-curso RubyOnRails CESOLMini-curso RubyOnRails CESOL
Mini-curso RubyOnRails CESOLtarginosilveira
 
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 virtualizadosThiago Rodrigues
 
Entre na fila. Processamento distribuído usando Gearman
Entre na fila. Processamento distribuído usando GearmanEntre na fila. Processamento distribuído usando Gearman
Entre na fila. Processamento distribuído usando GearmanElton Minetto
 
Docker - Tutorial for beginners
Docker - Tutorial for beginnersDocker - Tutorial for beginners
Docker - Tutorial for beginnersRafael Chiavegatto
 

Similaire à Dockerizando aplicações em uma fintech o bom, o mau e o feio as surpresas (20)

Dockerizando aplicações em uma Fintech
Dockerizando aplicações em uma FintechDockerizando aplicações em uma Fintech
Dockerizando aplicações em uma Fintech
 
Docker API Client with PHP and PYTHON
Docker API Client with PHP and PYTHONDocker API Client with PHP and PYTHON
Docker API Client with PHP and PYTHON
 
Aula Ruby
Aula RubyAula Ruby
Aula Ruby
 
Dockerizando uma aplicação NodeJS
Dockerizando uma aplicação NodeJSDockerizando uma aplicação NodeJS
Dockerizando uma aplicação NodeJS
 
Docker Swarm - Sua aplicação pronta para escalar
Docker Swarm - Sua aplicação pronta para escalarDocker Swarm - Sua aplicação pronta para escalar
Docker Swarm - Sua aplicação pronta para escalar
 
Construindo um data warehouse com Pentaho e Docker
Construindo um data warehouse com Pentaho e DockerConstruindo um data warehouse com Pentaho e Docker
Construindo um data warehouse com Pentaho e Docker
 
Deploy Heroku
Deploy HerokuDeploy Heroku
Deploy Heroku
 
Desenvolvendo para WordPress com Docker, Git e WP-CLI
Desenvolvendo para WordPress com Docker, Git e WP-CLIDesenvolvendo para WordPress com Docker, Git e WP-CLI
Desenvolvendo para WordPress com Docker, Git e WP-CLI
 
Ambiente de desenvolvimento com docker e ruby on rails
Ambiente de desenvolvimento com  docker e ruby on railsAmbiente de desenvolvimento com  docker e ruby on rails
Ambiente de desenvolvimento com docker e ruby on rails
 
Debug de cabo a rabo
Debug de cabo a raboDebug de cabo a rabo
Debug de cabo a rabo
 
Integração Contínua com Cruise Control e phpUnderControl
Integração Contínua com Cruise Control e phpUnderControlIntegração Contínua com Cruise Control e phpUnderControl
Integração Contínua com Cruise Control e phpUnderControl
 
Aplicações 12 fatores, melhor com Docker
Aplicações 12 fatores, melhor com DockerAplicações 12 fatores, melhor com Docker
Aplicações 12 fatores, melhor com Docker
 
Introdução ao Docker
Introdução ao DockerIntrodução ao Docker
Introdução ao Docker
 
Vamos falar de docker
Vamos falar de dockerVamos falar de docker
Vamos falar de docker
 
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)
 
Mini-curso RubyOnRails CESOL
Mini-curso RubyOnRails CESOLMini-curso RubyOnRails CESOL
Mini-curso RubyOnRails CESOL
 
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
 
Entre na fila. Processamento distribuído usando Gearman
Entre na fila. Processamento distribuído usando GearmanEntre na fila. Processamento distribuído usando Gearman
Entre na fila. Processamento distribuído usando Gearman
 
Plack
PlackPlack
Plack
 
Docker - Tutorial for beginners
Docker - Tutorial for beginnersDocker - Tutorial for beginners
Docker - Tutorial for beginners
 

Dockerizando aplicações em uma fintech o bom, o mau e o feio as surpresas

  • 1. Dockerizando aplicações em uma Fintech O bom, o mau e o feio/as surpresas
  • 2. Rafael Gomes Pai de um menino DevOps Engineer #PayCertify Soteropolitano Docker Captain Membro do Core Team do DevOpsDays #devops #docker INICIATIVAS Raul Hacker Club Gatilho Kosmico: gatilhokosmico.com.br CONTATOS @gomex https://gomex.me/ https://www.linkedin.com/in/rbgomes/
  • 3. O que estou fazendo? Docker para Desenvolvedores Pague quanto quiser Inclusive nada Aberto Você só precisa citar o autor Colaborativo https://github.com/gomex/docker-para-desenvolvedores Link https://leanpub.com/dockerparadesenvolvedores
  • 4. O que estou fazendo? Gatilho Kosmico Um podcast diverso A ideia é unir conhecimentos Tem um programa sobre DevOps "DevOps é cargo?" :) Colaborativo Tem alguma sugestão? Onde baixar http://gatilhokosmico.com.br Não é gatinho cósmico, ok? :P
  • 7. Ecossistema de pagamento 100+ clientes Processa 50m dólares mês 20 desenvolvedores 10+ APIs 4 anos de empresa
  • 9. Transformar em imagem docker uma aplicação escrita em Ruby on Rails.
  • 11. - Usa NodeJS - Deploy manual no Heroku
  • 13.
  • 14. Entrega = Atender expectativas do cliente
  • 15. O método - Um exemplo
  • 16. Dockerizar uma app Ambiente Prod Ambiente QA Ambiente só de dev Entregue Criar CI Lint Entregue Criar artefato Deploy Teste Sonar Entregue
  • 18. Entregar um ambiente de desenvolvimento automatizado e padronizado 1
  • 20. 1. Não pode demorar o build da imagem 2. Possibilidade de manter cache de instalação de gems 3. Possibilidade de debugar o código da gem 4. Armazenar histórico irbrc 5. Precisa automatizar o primeiro uso (db creation, migration e etc) 6. Usuário diferente de root
  • 21. Exemplo do Dockerfile FROM ruby:2.5.1 as builder RUN curl -sL https://deb.nodesource.com/setup_8.x | bash - && curl -sS https://dl.yarnpkg.com/debian/pubkey.g pg | apt-key add - && echo "deb https://dl.yarnpkg.com/debian/ stable main" | tee /etc/apt/sources.list.d/yarn.list ARG NODE_DATE_INSTALL=20180710 RUN apt-get update && apt-get install -y locales graphviz imagemagick postgresql-client-9.6 yarn nodejs && echo "en_US.UTF-8 UTF-8" > /etc/locale.gen && /usr/sbin/locale-gen && rm -rf /var/lib/apt/lists/*
  • 22. … continuação do Dockerfile ARG BUNDLE_GITHUB__COM ENV BUNDLE_GITHUB__COM $BUNDLE_GITHUB__COM ENV GEM_HOME /gems/vendor ENV GEM_PATH /gems/vendor ENV GEM_SPEC_CACHE /gems/specs ENV BUNDLE_PATH /gems/vendor ENV BUNDLE_BIN /gems/vendor/bin ENV PATH /app/bin:/gems/vendor/bin:$PATH ARG RAILS_ENV ENV RAILS_ENV=$RAILS_ENV ENV APP_ROOT /app WORKDIR $APP_ROOT/ RUN mkdir -p /gems RUN groupadd -r app && groupmod -g 1000 app && useradd -g app -ms /bin/bash app && chown app $APP_ROOT && chown -R app /gems USER app
  • 23. Exemplo do docker-compose version: '3.4' services: app: working_dir: $PWD build: context: . target: builder args: BUNDLE_GITHUB__COM: $BUNDLE_GITHUB__COM RAILS_ENV: development
  • 24. …continuação do docker-compose image: app:development env_file: - ./.env command: bundle exec rails server -b 0.0.0.0 volumes: - ./utils_ruby:/utils_ruby - .:$PWD - gems_2_5_1:/gems - app_home:/home/app/ - .irbrc:/home/app/.irbrc ports: - 3010:3000 depends_on: - mailcatcher - postgres - redis
  • 25. 1. Não pode demorar o build da imagem 2. Possibilidade de manter cache de instalação de gems 3. Possibilidade de debugar o código da gem 4. Armazenar histórico irbrc 5. Precisa automatizar o primeiro uso (db creation, migration e etc) 6. Usuário diferente de root
  • 26.
  • 27. Exemplo do Makefile dev: ## Start complete app dev environment docker-compose up --build dev-first: ## Start complete app dev environment docker-compose rm -f docker-compose build docker-compose run app bundle install --gemfile=Gemfile docker-compose run app yarn install docker-compose run app rails db:drop docker-compose run app rails db:create db:migrate db:seed docker-compose stop
  • 28. 1. Não pode demorar o build da imagem 2. Possibilidade de manter cache de instalação de gems 3. Possibilidade de debugar o código da gem 4. Armazenar histórico irbrc 5. Precisa automatizar o primeiro uso (db creation, migration e etc) 6. Usuário diferente de root
  • 30. Entregar as melhores práticas de um pipeline de entrega de imagens docker como artefato 2
  • 32. Precisamos incluir o conceito de lint no CI
  • 33. Exemplo do Jenkinsfile stages { stage('lint') { agent { docker { image 'paycertify/docker-lint:v2' } } steps { sh 'dockerfile_lint -f Dockerfile -r /rules/default_rules.yaml' } }
  • 34. Exemplo do Dockerfile do Docker-lint FROM projectatomic/dockerfile-lint:latest LABEL maintainer "Rafael Gomes <rafael.gomes@paycertify.com>" COPY default_rules.yaml /rules/default_rules.yaml
  • 35. Exemplo do default_rules do Docker-lint required_instructions: - instruction: "EXPOSE" count: 1 level: "info" message: "There is no 'EXPOSE' instruction" description: "Without exposed ports how will the service be accessed?" reference_url: - "https://docs.docker.com/engine/reference/builder/" - "#expose"
  • 36. Resultado do lint no pipeline
  • 37. O teste precisa de Banco
  • 38. Exemplo do Jenkinsfile stage('test') { steps { sh 'make dev-first' sh 'make rspec-test' sh 'make db-drop' } }
  • 39. Exemplo do Makefile dev-first: ## Start complete app dev environment docker-compose rm -f docker-compose build docker-compose run app bundle install --gemfile=Gemfile docker-compose run app yarn install docker-compose run app rails db:drop docker-compose run app rails db:create db:migrate db:seed docker-compose stop
  • 40. ...Continuação do Makefile rspec-test: ## Run rspec test docker-compose rm -f docker-compose build docker-compose run app rspec . docker-compose stop db-drop: ## Drop DB docker-compose rm -f docker-compose build docker-compose run app rails db:drop docker-compose stop
  • 41. Resultado do rspec no pipeline
  • 42. Uma imagem docker apenas!
  • 43. Dockerfile MultiStage Build FROM ruby:2.5.1 as builder … FROM builder as install <Copia gemfile e package.json para instalar pacotes nodes e gems> FROM install as preprod <Copia o código e compila os assets do node>
  • 44. Dockerfile MultiStage Build FROM paycertify/ruby:2.5.1-slim as prod ... WORKDIR /app/ ... COPY --from=preprod /usr/local/bundle/ /usr/local/bundle/ COPY --from=preprod /app/ /app/ COPY --from=preprod /gems/ /gems/ EXPOSE 3000 CMD ["bundle","exec","rails","server","-b","0.0.0.0"]
  • 45. Exemplo do Jenkinsfile stage('build') { steps { script { sh "make qa-build" println "Newly generated app image" } } }
  • 46. Makefile qa-build: ## Build QA image docker build -t app:$(GIT_COMMIT) --target prod .
  • 47. Aplicando tag e mandando pra Heroku
  • 48. Exemplo do Jenkinsfile stage('tag-push-qa') { when { branch "staging" } steps { script { sh 'make heroku-tag-qa' } } }
  • 49. Makefile heroku-tag-qa: docker-heroku-login ## Tag QA image docker tag app:$(GIT_COMMIT) registry.heroku.com/app/web docker tag worker:$(GIT_COMMIT) registry.heroku.com/app/worker docker push registry.heroku.com/app/web docker push registry.heroku.com/app/worker # HELPERS docker-heroku-login: ## Auto login to Heroku Docker Registry docker login --username=_ --password=$(API_KEY) registry.heroku.com
  • 51. Exemplo do Jenkinsfile stage('deploy-heroku-qa') { when { branch "staging" } steps { sh 'make heroku-release-qa' } }
  • 52. Makefile heroku-release-qa: ## Release QA image heroku container:release --app app web heroku run -a app rails db:migrate
  • 53. A aplicação precisa ser testada end-to-end (capybara)
  • 54. Exemplo do Jenkinsfile stage('QA e2e test') { when { branch "staging" } steps { script { sh 'make e2e_test' } } }
  • 55. Makefile e2e_test: ## Start complete app QA environment docker run --rm -e URL_STAGING=$$URL_STAGING -e EMAIL_ADMIN=$$EMAIL_ADMIN -e EMAIL_MERCHANT=$$EMAIL_MERCHANT -e PASSWORD=$$PASSWORD -e HUB=$$HUB -v $$PWD/test/e2e_tests:/test paycertify/capybara:0.4
  • 58. A solução proposta atende às expectativas dos desenvolvedores? Lembre-se nosso objetivo aqui é isso! 3
  • 59. Cada passo, cada mudança no projeto foi revisada e aceita o PR por ao menos um pessoa do time de dev
  • 60. Parear com o time de dev e obter experiência
  • 62. A janela de mudança precisa ser a menor possível 4
  • 63. Um backup e restore do banco de produção manual para o ambiente automatizado é necessário
  • 64. Exemplo de comandos do Heroku heroku pg:backups:download b001 --app manual-prod-app heroku pg:backups:restore latest.dump --app auto-prod-app
  • 66. Rafael Gomes Pai de um menino DevOps Engineer #PayCertify Soteropolitano Docker Captain Membro do Core Team do DevOpsDays #devops #docker INICIATIVAS Raul Hacker Club Core team do DevOpsDays CONTATOS @gomex https://gomex.me/ https://www.linkedin.com/in/rbgomes/