Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Boas Práticas com Docker

Boas Práticas com Docker

Bruno Russi Lautenschlager

October 27, 2022
Tweet

More Decks by Bruno Russi Lautenschlager

Other Decks in Programming

Transcript

  1. 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
  2. CONFIDENTIAL designator Bruno Russi Lautenschlager • Arquiteto Transformacional @ Red

    Hat • AWS Community Builder • Creator @ Rocketseat • Pai de pet • YouTuber linktr.ee/bruno_russi
  3. CONFIDENTIAL designator Join at slido.com #2320980 ⓘ Start presenting to

    display the joining instructions on this slide.
  4. CONFIDENTIAL designator Para você, o que é docker? ⓘ Start

    presenting to display the poll results on this slide.
  5. 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
  6. 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/
  7. 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
  8. 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
  9. 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
  10. CONFIDENTIAL designator FROM ▸ Nunca use a tag LATEST ▸

    Sempre utilize versões específicas 20
  11. 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
  12. 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
  13. 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
  14. 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
  15. 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
  16. 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
  17. 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
  18. CONFIDENTIAL designator Use argumentos multi-line ▸ Fica mais fácil de

    visualizar, commitar, revisar ▸ Se possível, ordenar em ordem alfabética 30
  19. 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"
  20. 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
  21. 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
  22. 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
  23. 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
  24. 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
  25. 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
  26. CONFIDENTIAL designator Volumes 38 ▸ Quando usar COPY ou Volume?

    ▸ Volumes em produção (Ex: Wordpress)
  27. 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
  28. CONFIDENTIAL designator Bonus 🥰 41 ▸ Lint: ・ dockerfile_lint ・

    hadolint ・ dockerfilelint ▸ Segurança: ・ clair ・ Quay.io ・ Sysdig - Image Scan