SlideShare uma empresa Scribd logo
1 de 64
Baixar para ler offline
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
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/

Mais conteúdo relacionado

Mais procurados

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 aplicações em uma fintech o bom, o mau e o feio as surpresas
Dockerizando aplicações em uma fintech  o bom, o mau e o feio as surpresasDockerizando aplicações em uma fintech  o bom, o mau e o feio as surpresas
Dockerizando aplicações em uma fintech o bom, o mau e o feio as surpresasRafael Gomes
 
Ionic Framework - Parte 1 - Iniciando um Projeto mais Robusto
Ionic Framework - Parte 1 - Iniciando um Projeto mais RobustoIonic Framework - Parte 1 - Iniciando um Projeto mais Robusto
Ionic Framework - Parte 1 - Iniciando um Projeto mais RobustoAlamo Saravali
 
Integração Contínua com CruiseControl e phpUnderControl
Integração Contínua com CruiseControl e phpUnderControlIntegração Contínua com CruiseControl e phpUnderControl
Integração Contínua com CruiseControl e phpUnderControlDiego Tremper
 
Mini curso: Ionic Framework
Mini curso: Ionic FrameworkMini curso: Ionic Framework
Mini curso: Ionic FrameworkLoiane Groner
 
Automação de build para frontend
Automação de build para frontendAutomação de build para frontend
Automação de build para frontendVanessa Me Tonini
 
Integracao Contínua com CruiseControl e phpUnderControl
Integracao Contínua com CruiseControl e phpUnderControlIntegracao Contínua com CruiseControl e phpUnderControl
Integracao Contínua com CruiseControl e phpUnderControlDiego Tremper
 
Maven 3, Sonar e Hudson
Maven 3, Sonar e HudsonMaven 3, Sonar e Hudson
Maven 3, Sonar e HudsonRodrigo Branas
 
Jenkins, o CI ao seu dispor
Jenkins, o CI ao seu disporJenkins, o CI ao seu dispor
Jenkins, o CI ao seu dispors4nx
 
TDC2015 Porto Alegre - Interfaces ricas com Rails e React.JS
TDC2015  Porto Alegre - Interfaces ricas com Rails e React.JSTDC2015  Porto Alegre - Interfaces ricas com Rails e React.JS
TDC2015 Porto Alegre - Interfaces ricas com Rails e React.JSRodrigo Urubatan
 
Introdução ao docker
Introdução ao dockerIntrodução ao docker
Introdução ao dockerBenicio Ávila
 
Interfaces ricas com Rails e React.JS @ Rubyconf 2015
Interfaces ricas com Rails e React.JS @ Rubyconf 2015Interfaces ricas com Rails e React.JS @ Rubyconf 2015
Interfaces ricas com Rails e React.JS @ Rubyconf 2015Rodrigo Urubatan
 
[Mini Palestra] - Deploy de-apps-php-com-capistrano
[Mini Palestra] - Deploy de-apps-php-com-capistrano[Mini Palestra] - Deploy de-apps-php-com-capistrano
[Mini Palestra] - Deploy de-apps-php-com-capistranoCode Experts Learning
 
Apresentação maven
Apresentação mavenApresentação maven
Apresentação mavenAndré Justi
 
Ionic 2/3 + Firebase
Ionic 2/3 + FirebaseIonic 2/3 + Firebase
Ionic 2/3 + FirebaseBruno Catão
 
Minicurso Play Framework - Tão fácil que nem parece Java
Minicurso Play Framework - Tão fácil que nem parece JavaMinicurso Play Framework - Tão fácil que nem parece Java
Minicurso Play Framework - Tão fácil que nem parece JavaWandesson Soares
 

Mais procurados (20)

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
 
Dockerizando aplicações em uma fintech o bom, o mau e o feio as surpresas
Dockerizando aplicações em uma fintech  o bom, o mau e o feio as surpresasDockerizando aplicações em uma fintech  o bom, o mau e o feio as surpresas
Dockerizando aplicações em uma fintech o bom, o mau e o feio as surpresas
 
Ionic Framework - Parte 1 - Iniciando um Projeto mais Robusto
Ionic Framework - Parte 1 - Iniciando um Projeto mais RobustoIonic Framework - Parte 1 - Iniciando um Projeto mais Robusto
Ionic Framework - Parte 1 - Iniciando um Projeto mais Robusto
 
Integração Contínua com CruiseControl e phpUnderControl
Integração Contínua com CruiseControl e phpUnderControlIntegração Contínua com CruiseControl e phpUnderControl
Integração Contínua com CruiseControl e phpUnderControl
 
Web Offline
Web OfflineWeb Offline
Web Offline
 
Mini curso: Ionic Framework
Mini curso: Ionic FrameworkMini curso: Ionic Framework
Mini curso: Ionic Framework
 
Automação de build para frontend
Automação de build para frontendAutomação de build para frontend
Automação de build para frontend
 
Integracao Contínua com CruiseControl e phpUnderControl
Integracao Contínua com CruiseControl e phpUnderControlIntegracao Contínua com CruiseControl e phpUnderControl
Integracao Contínua com CruiseControl e phpUnderControl
 
Maven 3, Sonar e Hudson
Maven 3, Sonar e HudsonMaven 3, Sonar e Hudson
Maven 3, Sonar e Hudson
 
Apresentacao de Introdução ao Apache Maven
Apresentacao de Introdução ao Apache MavenApresentacao de Introdução ao Apache Maven
Apresentacao de Introdução ao Apache Maven
 
Jenkins, o CI ao seu dispor
Jenkins, o CI ao seu disporJenkins, o CI ao seu dispor
Jenkins, o CI ao seu dispor
 
TDC2015 Porto Alegre - Interfaces ricas com Rails e React.JS
TDC2015  Porto Alegre - Interfaces ricas com Rails e React.JSTDC2015  Porto Alegre - Interfaces ricas com Rails e React.JS
TDC2015 Porto Alegre - Interfaces ricas com Rails e React.JS
 
Curso de ReactJS
Curso de ReactJSCurso de ReactJS
Curso de ReactJS
 
Introdução ao docker
Introdução ao dockerIntrodução ao docker
Introdução ao docker
 
Interfaces ricas com Rails e React.JS @ Rubyconf 2015
Interfaces ricas com Rails e React.JS @ Rubyconf 2015Interfaces ricas com Rails e React.JS @ Rubyconf 2015
Interfaces ricas com Rails e React.JS @ Rubyconf 2015
 
[Mini Palestra] - Deploy de-apps-php-com-capistrano
[Mini Palestra] - Deploy de-apps-php-com-capistrano[Mini Palestra] - Deploy de-apps-php-com-capistrano
[Mini Palestra] - Deploy de-apps-php-com-capistrano
 
Apresentação maven
Apresentação mavenApresentação maven
Apresentação maven
 
Ionic 2/3 + Firebase
Ionic 2/3 + FirebaseIonic 2/3 + Firebase
Ionic 2/3 + Firebase
 
Curso de Grails
Curso de GrailsCurso de Grails
Curso de Grails
 
Minicurso Play Framework - Tão fácil que nem parece Java
Minicurso Play Framework - Tão fácil que nem parece JavaMinicurso Play Framework - Tão fácil que nem parece Java
Minicurso Play Framework - Tão fácil que nem parece Java
 

Semelhante a Dockerizando aplicações em uma Fintech

Desenvolvimento em .NET utilizando Docker - Meetup 8 Itu Developers
Desenvolvimento em .NET utilizando Docker - Meetup 8 Itu DevelopersDesenvolvimento em .NET utilizando Docker - Meetup 8 Itu Developers
Desenvolvimento em .NET utilizando Docker - Meetup 8 Itu DevelopersDextra Sistemas / Etec Itu
 
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 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
 
Mercurianos - .Net na Prática - Da instalação até o debug da nossa API em um ...
Mercurianos - .Net na Prática - Da instalação até o debug da nossa API em um ...Mercurianos - .Net na Prática - Da instalação até o debug da nossa API em um ...
Mercurianos - .Net na Prática - Da instalação até o debug da nossa API em um ...Eliel Simoncelo
 
Dockerizando uma aplicação NodeJS
Dockerizando uma aplicação NodeJSDockerizando uma aplicação NodeJS
Dockerizando uma aplicação NodeJSLuís Bianchin
 
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
 
Acelerando a entrega de software com as ferramentas de desenvolvimento da AWS
Acelerando a entrega de software com as ferramentas de desenvolvimento da AWSAcelerando a entrega de software com as ferramentas de desenvolvimento da AWS
Acelerando a entrega de software com as ferramentas de desenvolvimento da AWSAmazon Web Services LATAM
 
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
 
Containers com docker #CPRecife4
Containers com docker #CPRecife4Containers com docker #CPRecife4
Containers com docker #CPRecife4David Ruiz
 
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
 
Desenvolvendo com PHP e Docker
Desenvolvendo com PHP e DockerDesenvolvendo com PHP e Docker
Desenvolvendo com PHP e DockerWaldemar Neto
 
Docker - minicurso utfpr 2017
Docker -  minicurso utfpr 2017Docker -  minicurso utfpr 2017
Docker - minicurso utfpr 2017Fabio Janiszevski
 
Workshop react + adonis.js
Workshop react + adonis.jsWorkshop react + adonis.js
Workshop react + adonis.jsDenis Velrino
 
Vagrant & Docker: carregue seus ambientes no bolso
Vagrant & Docker: carregue seus ambientes no bolsoVagrant & Docker: carregue seus ambientes no bolso
Vagrant & Docker: carregue seus ambientes no bolsoDiogo Lucas
 

Semelhante a Dockerizando aplicações em uma Fintech (20)

Aula Ruby
Aula RubyAula Ruby
Aula Ruby
 
Desenvolvimento em .NET utilizando Docker - Meetup 8 Itu Developers
Desenvolvimento em .NET utilizando Docker - Meetup 8 Itu DevelopersDesenvolvimento em .NET utilizando Docker - Meetup 8 Itu Developers
Desenvolvimento em .NET utilizando Docker - Meetup 8 Itu Developers
 
Usando Docker no desenvolvimento .NET
Usando Docker no desenvolvimento .NETUsando Docker no desenvolvimento .NET
Usando Docker no desenvolvimento .NET
 
Source-to-container no mundo real
Source-to-container no mundo realSource-to-container no mundo real
Source-to-container no mundo real
 
Alagoas Dev Day
Alagoas Dev DayAlagoas Dev Day
Alagoas Dev Day
 
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
 
Mercurianos - .Net na Prática - Da instalação até o debug da nossa API em um ...
Mercurianos - .Net na Prática - Da instalação até o debug da nossa API em um ...Mercurianos - .Net na Prática - Da instalação até o debug da nossa API em um ...
Mercurianos - .Net na Prática - Da instalação até o debug da nossa API em um ...
 
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
 
Dockerizando uma aplicação NodeJS
Dockerizando uma aplicação NodeJSDockerizando uma aplicação NodeJS
Dockerizando uma aplicação NodeJS
 
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
 
Acelerando a entrega de software com as ferramentas de desenvolvimento da AWS
Acelerando a entrega de software com as ferramentas de desenvolvimento da AWSAcelerando a entrega de software com as ferramentas de desenvolvimento da AWS
Acelerando a entrega de software com as ferramentas de desenvolvimento da AWS
 
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
 
Containers com docker #CPRecife4
Containers com docker #CPRecife4Containers com docker #CPRecife4
Containers com docker #CPRecife4
 
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
 
Desenvolvendo com PHP e Docker
Desenvolvendo com PHP e DockerDesenvolvendo com PHP e Docker
Desenvolvendo com PHP e Docker
 
Docker - minicurso utfpr 2017
Docker -  minicurso utfpr 2017Docker -  minicurso utfpr 2017
Docker - minicurso utfpr 2017
 
Debug de cabo a rabo
Debug de cabo a raboDebug de cabo a rabo
Debug de cabo a rabo
 
Workshop react + adonis.js
Workshop react + adonis.jsWorkshop react + adonis.js
Workshop react + adonis.js
 
Vagrant & Docker: carregue seus ambientes no bolso
Vagrant & Docker: carregue seus ambientes no bolsoVagrant & Docker: carregue seus ambientes no bolso
Vagrant & Docker: carregue seus ambientes no bolso
 
Iniciando com django
Iniciando com djangoIniciando com django
Iniciando com django
 

Mais de Rafael Gomes

Precisamos falar sobre teste de infra
Precisamos falar sobre teste de infraPrecisamos falar sobre teste de infra
Precisamos falar sobre teste de infraRafael Gomes
 
Precisamos falar sobre teste de infra
Precisamos falar sobre teste de infraPrecisamos falar sobre teste de infra
Precisamos falar sobre teste de infraRafael Gomes
 
Cansei de trabalho manual, quero automatizar tudo!
Cansei de trabalho manual, quero automatizar tudo!Cansei de trabalho manual, quero automatizar tudo!
Cansei de trabalho manual, quero automatizar tudo!Rafael Gomes
 
Precisamos falar sobre Testes de infraestrutura
Precisamos falar sobre Testes de infraestruturaPrecisamos falar sobre Testes de infraestrutura
Precisamos falar sobre Testes de infraestruturaRafael Gomes
 
Docker 1.12 - Swarm Mode
Docker 1.12 - Swarm ModeDocker 1.12 - Swarm Mode
Docker 1.12 - Swarm ModeRafael Gomes
 
Troubleshooting docker
Troubleshooting dockerTroubleshooting docker
Troubleshooting dockerRafael Gomes
 
Docker como super comando
Docker como super comandoDocker como super comando
Docker como super comandoRafael Gomes
 
TDC 2016 Floripa - Workshop docker
TDC 2016 Floripa - Workshop dockerTDC 2016 Floripa - Workshop docker
TDC 2016 Floripa - Workshop dockerRafael Gomes
 
Docker for tooling
Docker for toolingDocker for tooling
Docker for toolingRafael Gomes
 
Monitoramento de ativos com zabbix
Monitoramento de ativos com zabbixMonitoramento de ativos com zabbix
Monitoramento de ativos com zabbixRafael Gomes
 
Gestão e monitoramento de redes e dispositivos com Zabbix - FISL12
Gestão e monitoramento de redes e dispositivos com Zabbix - FISL12Gestão e monitoramento de redes e dispositivos com Zabbix - FISL12
Gestão e monitoramento de redes e dispositivos com Zabbix - FISL12Rafael Gomes
 

Mais de Rafael Gomes (12)

Precisamos falar sobre teste de infra
Precisamos falar sobre teste de infraPrecisamos falar sobre teste de infra
Precisamos falar sobre teste de infra
 
Precisamos falar sobre teste de infra
Precisamos falar sobre teste de infraPrecisamos falar sobre teste de infra
Precisamos falar sobre teste de infra
 
Cansei de trabalho manual, quero automatizar tudo!
Cansei de trabalho manual, quero automatizar tudo!Cansei de trabalho manual, quero automatizar tudo!
Cansei de trabalho manual, quero automatizar tudo!
 
Workshop Docker
Workshop DockerWorkshop Docker
Workshop Docker
 
Precisamos falar sobre Testes de infraestrutura
Precisamos falar sobre Testes de infraestruturaPrecisamos falar sobre Testes de infraestrutura
Precisamos falar sobre Testes de infraestrutura
 
Docker 1.12 - Swarm Mode
Docker 1.12 - Swarm ModeDocker 1.12 - Swarm Mode
Docker 1.12 - Swarm Mode
 
Troubleshooting docker
Troubleshooting dockerTroubleshooting docker
Troubleshooting docker
 
Docker como super comando
Docker como super comandoDocker como super comando
Docker como super comando
 
TDC 2016 Floripa - Workshop docker
TDC 2016 Floripa - Workshop dockerTDC 2016 Floripa - Workshop docker
TDC 2016 Floripa - Workshop docker
 
Docker for tooling
Docker for toolingDocker for tooling
Docker for tooling
 
Monitoramento de ativos com zabbix
Monitoramento de ativos com zabbixMonitoramento de ativos com zabbix
Monitoramento de ativos com zabbix
 
Gestão e monitoramento de redes e dispositivos com Zabbix - FISL12
Gestão e monitoramento de redes e dispositivos com Zabbix - FISL12Gestão e monitoramento de redes e dispositivos com Zabbix - FISL12
Gestão e monitoramento de redes e dispositivos com Zabbix - FISL12
 

Dockerizando aplicações em uma Fintech

  • 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
  • 5. Ecossistema de pagamento 100+ clientes Processa 50m dólares mês 20 desenvolvedores 10+ APIs 4 anos de empresa
  • 7. Transformar em imagem docker uma aplicação escrita em Ruby on Rails.
  • 9. - Usa NodeJS - Deploy manual no Heroku
  • 11.
  • 12. Entrega = Atender expectativas do cliente
  • 13. O método - Um exemplo
  • 14. Dockerizar uma app Ambiente Prod Ambiente QA Ambiente só de dev Entregue Criar CI Lint Entregue Criar artefato Deploy Teste Sonar Entregue
  • 16. Entregar um ambiente de desenvolvimento automatizado e padronizado 1
  • 18. 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
  • 19. 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/*
  • 20. … 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
  • 21. 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
  • 22. …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
  • 23. 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
  • 24.
  • 25. 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
  • 26. 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
  • 28. Entregar as melhores práticas de um pipeline de entrega de imagens docker como artefato 2
  • 30. Precisamos incluir o conceito de lint no CI
  • 31. Exemplo do Jenkinsfile stages { stage('lint') { agent { docker { image 'paycertify/docker-lint:v2' } } steps { sh 'dockerfile_lint -f Dockerfile -r /rules/default_rules.yaml' } }
  • 32. 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
  • 33. 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"
  • 34. Resultado do lint no pipeline
  • 35. O teste precisa de Banco
  • 36. Exemplo do Jenkinsfile stage('test') { steps { sh 'make dev-first' sh 'make rspec-test' sh 'make db-drop' } }
  • 37. 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
  • 38. ...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
  • 39. Resultado do rspec no pipeline
  • 40. Uma imagem docker apenas!
  • 41. 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>
  • 42. 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"]
  • 43. Exemplo do Jenkinsfile stage('build') { steps { script { sh "make qa-build" println "Newly generated app image" } } }
  • 44. Makefile qa-build: ## Build QA image docker build -t app:$(GIT_COMMIT) --target prod .
  • 45. Aplicando tag e mandando pra Heroku
  • 46. Exemplo do Jenkinsfile stage('tag-push-qa') { when { branch "staging" } steps { script { sh 'make heroku-tag-qa' } } }
  • 47. 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
  • 49. Exemplo do Jenkinsfile stage('deploy-heroku-qa') { when { branch "staging" } steps { sh 'make heroku-release-qa' } }
  • 50. Makefile heroku-release-qa: ## Release QA image heroku container:release --app app web heroku run -a app rails db:migrate
  • 51. A aplicação precisa ser testada end-to-end (capybara)
  • 52. Exemplo do Jenkinsfile stage('QA e2e test') { when { branch "staging" } steps { script { sh 'make e2e_test' } } }
  • 53. 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
  • 56. A solução proposta atende às expectativas dos desenvolvedores? Lembre-se nosso objetivo aqui é isso! 3
  • 57. Cada passo, cada mudança no projeto foi revisada e aceita o PR por ao menos um pessoa do time de dev
  • 58. Parear com o time de dev e obter experiência
  • 60. A janela de mudança precisa ser a menor possível 4
  • 61. Um backup e restore do banco de produção manual para o ambiente automatizado é necessário
  • 62. Exemplo de comandos do Heroku heroku pg:backups:download b001 --app manual-prod-app heroku pg:backups:restore latest.dump --app auto-prod-app
  • 64. 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/