Slide 1

Slide 1 text

CONFIDENTIAL designator Docker 101 & guia de construção de Dockerfile Boas práticas para Dockerfile OPEN INNOVATION LABS Bruno Russi Lautenschlager Transformation Architect LATAM 1

Slide 2

Slide 2 text

CONFIDENTIAL designator Bruno Russi Lautenschlager ● Arquiteto Transformacional @ Red Hat ● AWS Community Builder ● Creator @ Rocketseat ● Pai de pet ● YouTuber linktr.ee/bruno_russi

Slide 3

Slide 3 text

CONFIDENTIAL designator Join at slido.com #2320980 ⓘ Start presenting to display the joining instructions on this slide.

Slide 4

Slide 4 text

CONFIDENTIAL designator Introdução ao Docker Open Innovation Labs 4

Slide 5

Slide 5 text

CONFIDENTIAL designator Na minha máquina funciona Open Innovation Labs 5

Slide 6

Slide 6 text

CONFIDENTIAL designator Para você, o que é docker? ⓘ Start presenting to display the poll results on this slide.

Slide 7

Slide 7 text

CONFIDENTIAL designator Já utilizou docker? ⓘ Start presenting to display the poll results on this slide.

Slide 8

Slide 8 text

CONFIDENTIAL designator O que é Docker? Plataforma que usa virtualização a nível de OS para entregar software em pacotes independentes e reproduzíveis chamados de "containets". A tecnologia já existe desde 1979, porém Dokcer ajudou a popularizar como uma prática no desenvolvimento de software. Criado em 2011, por Solomon Hykes, na época como produto para uma empresa chamada dotCloud. 8

Slide 9

Slide 9 text

CONFIDENTIAL designator On Premises x VM's x Containers 9 On Premises Virtual Machine Container

Slide 10

Slide 10 text

CONFIDENTIAL designator Dockerfile 10

Slide 11

Slide 11 text

CONFIDENTIAL designator Timeline 11

Slide 12

Slide 12 text

CONFIDENTIAL designator Kubernetes usa Docker? O Kubernetes usa a interface CRI (Container Runtime Interface, criada especificamente para o k8s), enquanto o Docker utiliza a interface dockershim, a qual não é mais suportada pelo Kubernetes após a versão 1.20 12 https://kubernetes.io/pt-br/blog/2020/12/02/dont-panic-kubernetes-and-docker/ https://kubernetes.io/blog/2020/12/02/dockershim-faq/

Slide 13

Slide 13 text

CONFIDENTIAL designator Docker Hub ▸ Registry público de imagens; ▸ 100.000+ de imagens de contêineres de fornecedores de software, projetos de código aberto e da comunidade. 13

Slide 14

Slide 14 text

CONFIDENTIAL designator Container zen Open Innovation Labs 14

Slide 15

Slide 15 text

CONFIDENTIAL designator Containers efêmeros ▸ Container pode morrer a qualquer momento ▸ 12 factor app ▸ apt-get update ✅ ▸ apt-get upgrade ❌ ▸ Version pining ▸ Recriar facilmente e obter o mesmo resultado 15

Slide 16

Slide 16 text

CONFIDENTIAL designator Desacople aplicações ▸ Não rode mais de uma "aplicaç˜ ão" no mesmo container ▸ Cada vez que é executado um DB e uma aplicação no mesmo container um gatinho morre ▸ Filosofia UM container por processo ▸ Escalar apenas o que precisa ▸ Dependências feitas via rede ▸ docker-compose 16

Slide 17

Slide 17 text

CONFIDENTIAL designator Docker 101 Open Innovation Labs 17

Slide 18

Slide 18 text

CONFIDENTIAL designator Exemplo 18

Slide 19

Slide 19 text

CONFIDENTIAL designator Layers 19

Slide 20

Slide 20 text

CONFIDENTIAL designator FROM ▸ Nunca use a tag LATEST ▸ Sempre utilize versões específicas 20

Slide 21

Slide 21 text

CONFIDENTIAL designator FROM juquinha/jboss-sem-backdoors ▸ Segurança ▸ Verifique sempre o dono da imagem ▸ Dê sempre preferência às imagens oficiais e publishers verificados ▸ Audite o Dockerfile sempre que possivel! 21

Slide 22

Slide 22 text

CONFIDENTIAL designator FROM scratch sempre? ▸ Equipe de engenheiros da ferramenta provavelmente faz um trabalho melhor ▸ Evite o retrabalho, a chance de fazer alguma configuração errada no JBOSS é maior 22

Slide 23

Slide 23 text

CONFIDENTIAL designator Somente o necessário ▸ Instalar somente o necessário (especialmente em produção) ▸ apt-get install php-7.4-* ▸ Imagem de 4GB ▸ ECR U$$ 0.10 p GB / mes ▸ Imagem base alpine ▸ apt --no-install-recommends 23

Slide 24

Slide 24 text

CONFIDENTIAL designator Build context ▸ docker build -t naruto-app . 24

Slide 25

Slide 25 text

CONFIDENTIAL designator Build context - dockerignore 25

Slide 26

Slide 26 text

CONFIDENTIAL designator Economize layers ▸ Evitar 500 RUN's, mas também evitar somente 1 ▸ Encontrar um equilíbrio entre legibilidade e número de layers ▸ Aproveitar o build cache (spoiler) ▸ Muilti satge build (spoiler) 26

Slide 27

Slide 27 text

CONFIDENTIAL designator Aproveite o build cache ▸ Organize o Dockerfile para colocar os comandos menos mutáveis no topo ▸ Código da aplicação ou dependências geralmente no final do arquivo ▸ Atenção ⚠ ・ Sempre que rodar um apt install; ・ Rode sempre um update antes; 27

Slide 28

Slide 28 text

CONFIDENTIAL designator Multi stage build ▸ Linguagens compiladas: ・ Ex: GoLang, React, Java ▸ Um FROM só pra fazer fazer o build da imagem e outro para a execução 28

Slide 29

Slide 29 text

CONFIDENTIAL designator Multi stage build ▸ Linguagens compiladas: ・ Ex: GoLang, React, Java ▸ Um FROM só pra fazer fazer o build da imagem e outro para a execução 29

Slide 30

Slide 30 text

CONFIDENTIAL designator Use argumentos multi-line ▸ Fica mais fácil de visualizar, commitar, revisar ▸ Se possível, ordenar em ordem alfabética 30

Slide 31

Slide 31 text

CONFIDENTIAL designator CMD x ENTREYPOINT ▸ CMD ・ Software que vai executar sua aplicação, junto com os parâmetros ・ CMD ["executavel", "parm_1"] ・ Usado em 99%* dos casos ・ Permite que você rode o container com outro comando, ex: 31 docker run -it docker_talk:latest - sh -c "echo Hello world"

Slide 32

Slide 32 text

CONFIDENTIAL designator CMD x ENTREYPOINT ▸ ENTRYPOINT ・ "Ponto de entrada" da aplicação ENTRYPOINT ["aws", "s3"] CMD ["help"] ・ Permite passar argumentos diretos no docker run docker run -it s3helper ls ・ Permite utilizar script 32

Slide 33

Slide 33 text

CONFIDENTIAL designator CMD x ENTREYPOINT ▸ Prefira utilizar os [] CMD ["executavel", "param_1"] ✅ CMD "executavel" "param_1" ❌ ▸ Diferença na execução dentro do container 33

Slide 34

Slide 34 text

CONFIDENTIAL designator ADD x COPY ▸ COPY ・ Copia um arquivo ou diretório local (build context) para o container ▸ ADD ・ "Mesma" coisa que o COPY com algumas features ・ Permite utilizar URL como parametro ・ Realiza a extração arquivos .tar de maneira automática 34

Slide 35

Slide 35 text

CONFIDENTIAL designator ADD x COPY ▸ Qual usar? ▸ Sempre utilizar o COPY, a não ser que precise de uma dessas features: ADD arquivo.tar ADD https://raw.githubusercontent.com/foo/bar/script.sh 35

Slide 36

Slide 36 text

CONFIDENTIAL designator EXPOSE 36 ▸ Exposição das portas do container, possível fazer via CLI ou Dockerfile: ▸ CLI docker run -d -p 80:5000 docker_talk:latest ▸ Dockerfile EXPOSE 5000

Slide 37

Slide 37 text

CONFIDENTIAL designator ARG's 37 ▸ Argumentos a nível de build: ・ ARG DB_PASSWORD ▸ Não deixamos esses valores comitados, somente especificar no run/build

Slide 38

Slide 38 text

CONFIDENTIAL designator Volumes 38 ▸ Quando usar COPY ou Volume? ▸ Volumes em produção (Ex: Wordpress)

Slide 39

Slide 39 text

CONFIDENTIAL designator USER 39 ▸ Especifica qual o usuário vai executar o container ▸ Sempre que possível evitar a utilização do root ▸ Criar ou especificar o USER sempre que possível USER www-data

Slide 40

Slide 40 text

CONFIDENTIAL designator Bonus 🥰 40 https://www.fromlatest.io

Slide 41

Slide 41 text

CONFIDENTIAL designator Bonus 🥰 41 ▸ Lint: ・ dockerfile_lint ・ hadolint ・ dockerfilelint ▸ Segurança: ・ clair ・ Quay.io ・ Sysdig - Image Scan

Slide 42

Slide 42 text

CONFIDENTIAL designator Bonus 🥰 42 https://github.com/wagoodman/dive

Slide 43

Slide 43 text

CONFIDENTIAL designator linkedin.com/company/red-hat youtube.com/user/RedHatVideos facebook.com/redhatinc twitter.com/RedHat OPEN INNOVATION LABS 43 red.ht/labs Thank you.