{"id":3387,"date":"2018-01-16T12:08:28","date_gmt":"2018-01-16T14:08:28","guid":{"rendered":"https:\/\/blog.umbler.com\/?p=3387"},"modified":"2018-12-04T17:34:31","modified_gmt":"2018-12-04T19:34:31","slug":"containers-4-boas-praticas","status":"publish","type":"post","link":"https:\/\/blog.umbler.com\/br\/containers-4-boas-praticas\/","title":{"rendered":"Containers #4: Boas pr\u00e1ticas"},"content":{"rendered":"<p>Oi gente, tudo bem? Vamos ao quarto post da nossa s\u00e9rie! Hoje vamos conversar um pouco sobre coisas que voc\u00ea deve e deve fazer se quiser trabalhar com containers.<br \/>\nA gente j\u00e1 viu:<\/p>\n<ul>\n<li><a href=\"https:\/\/blog.umbler.com\/br\/containers-101-como-essa-tecnologia-pode-alavancar-suas-aplicacoes\/\">O que \u00e9 container<\/a>,<\/li>\n<li>j\u00e1 aprendemos a <a href=\"https:\/\/blog.umbler.com\/br\/containers-102-primeiros-passos-para-realizar-a-instalacao\/\">instalar o Docker<\/a> e<\/li>\n<li>j\u00e1 sabemos como <a href=\"https:\/\/blog.umbler.com\/br\/containers-3-como-containerizar-aplicacoes\/\">containerizar nossas aplica\u00e7\u00f5es<\/a>.<\/li>\n<\/ul>\n<p>Certo? Ent\u00e3o, nada melhor do que fazer isso seguindo as melhores pr\u00e1ticas do mercado, e \u00e9 justamente isso que abordaremos a seguir \ud83d\ude09<\/p>\n<h1>Dockerfile<\/h1>\n<p><a href=\"https:\/\/blog.umbler.com\/wp-content\/uploads\/2018\/01\/projeto.jpg\"><img fetchpriority=\"high\" decoding=\"async\" class=\"aligncenter\" src=\"https:\/\/blog.umbler.com\/wp-content\/uploads\/2018\/01\/projeto-1024x683.jpg\" alt=\"\" width=\"780\" height=\"520\" \/><\/a><br \/>\nVoc\u00ea pode criar um Dockerfile da forma que quiser, afinal, ele \u00e9 um descritivo de sua infraestrutura. Nele est\u00e3o os passos a serem seguidos para criar o seu ambiente para atender a necessidade da sua aplica\u00e7\u00e3o. Um ponto muito importante nesse processo \u00e9 que se voc\u00ea fizer de qualquer jeito, o build pode levar 5 segundos ou 40 minutos. Ou pior ainda, a imagem gerada pode ser t\u00e3o grande quanto um host comum, o que \u00e9 muito ruim, principalmente por ferir um dos princ\u00edpios de se utilizar container, que \u00e9 a portabilidade.<\/p>\n<p>Ent\u00e3o, observe os seguintes pontos:<\/p>\n<ul>\n<li>Utilize o m\u00ednimo de instru\u00e7\u00f5es poss\u00edveis. Se precisar executar mais de um comando, crie um shell script que fa\u00e7a isso e chame-o em uma instru\u00e7\u00e3o RUN;<\/li>\n<li>Em ordem, coloque sempre as instru\u00e7\u00f5es que nunca mudem no in\u00edcio do arquivo, isso far\u00e1 com que seu build seja muito mais r\u00e1pido;<\/li>\n<li>Fa\u00e7a uso do multi-stage build sempre que poss\u00edvel;<\/li>\n<li>Nunca fa\u00e7a update\/upgrade, isso garante que voc\u00ea utilizar\u00e1 sempre a mesma imagem base para o build;<\/li>\n<\/ul>\n<h1>Imagem<\/h1>\n<p><a href=\"https:\/\/blog.umbler.com\/wp-content\/uploads\/2018\/01\/images.png\"><img decoding=\"async\" class=\"aligncenter\" src=\"https:\/\/blog.umbler.com\/wp-content\/uploads\/2018\/01\/images.png\" alt=\"\" width=\"225\" height=\"225\" \/><\/a><br \/>\nPodemos chamar de imagem o artefato criado pelo processo de build do Docker, essa imagem deve ser independente e reutiliz\u00e1vel, ou seja, eu posso pegar essa imagem e enviar para qualquer host e execut\u00e1-la apenas com o comando docker run. Com isso, vamos as dicas quando falamos em imagens:<\/p>\n<ul>\n<li>Sempre utilize um hub para suas imagens Docker, fazer com que ela esteja apenas nos n\u00f3s \u00e9 ruim, pois caso o host falhe, voc\u00ea n\u00e3o poder\u00e1 reutilizar essa imagem. Ent\u00e3o, sempre opte por ter um hub central, seja open source ou n\u00e3o.<\/li>\n<li>Sempre que poss\u00edvel, utilize ferramentas para analisar a <a href=\"https:\/\/blog.umbler.com\/br\/seguranca-e-privacidade-no-atendimento-com-ia\/\">seguran\u00e7a<\/a> das imagens que voc\u00ea utiliza.<\/li>\n<li>Nunca salve dados sens\u00edveis dentro da imagem, existem outras formas melhores para resolver isso, ok?<\/li>\n<\/ul>\n<h1>Container<\/h1>\n<p><a href=\"https:\/\/blog.umbler.com\/wp-content\/uploads\/2018\/01\/shipping-container-b.jpg\"><img decoding=\"async\" class=\"aligncenter\" src=\"https:\/\/blog.umbler.com\/wp-content\/uploads\/2018\/01\/shipping-container-b-1024x611.jpg\" alt=\"\" width=\"780\" height=\"465\" \/><\/a><br \/>\nComo j\u00e1 sabemos, container nada mais \u00e9 do que um processo isolado, baseado em uma imagem constru\u00edda para atender uma necessidade espec\u00edfica. Pois bem, existem algumas dezenas de dicas para essa \u201cparte\u201d do ambiente, vamos falar sobre as quais eu considero mais importantes. Bora:<\/p>\n<ul>\n<li>Sempre que poss\u00edvel execute o container com um usu\u00e1rio restrito, apenas do Docker, para garantir o isolamento entre os containers e tudo mais. \u00c9 melhor dificultar o caminho para quem est\u00e1 mal intencionado, certo? E para fazer isso \u00e9 bem f\u00e1cil: par\u00e2metro -u no docker container create ou docker run \ud83d\ude09<\/li>\n<li>N\u00e3o salve nada dentro do container, utilize um volume para isso;<\/li>\n<li>Opte sempre por utilizar um plugin de logs, isso facilita a administra\u00e7\u00e3o do ambiente;<\/li>\n<li>N\u00e3o deixe sujeira. Utilize o docker system prune para remover aqueles containers que est\u00e3o parados h\u00e1 tempos;<\/li>\n<li>Limite, sempre que poss\u00edvel, a utiliza\u00e7\u00e3o de recursos de cada container;<\/li>\n<li>Utilize um container para cada servi\u00e7o, se tem MongoDB e Node.JS, por exemplo, utilize dois containers, e assim por diante;<\/li>\n<li>Esteja preparado para perder o container. Essa talvez seja a dica n\u00e3o t\u00e9cnica mais importante, pois um container N\u00c3O tem uma vida \u00fatil longa. Ent\u00e3o, pense em como sobreviver no caso de um dos containers sumir \ud83d\ude42<\/li>\n<\/ul>\n<h1>API<\/h1>\n<p><a href=\"https:\/\/blog.umbler.com\/wp-content\/uploads\/2018\/01\/api-a397cc184c5622fb5130af1b7baf149d.png\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter\" src=\"https:\/\/blog.umbler.com\/wp-content\/uploads\/2018\/01\/api-a397cc184c5622fb5130af1b7baf149d-300x300.png\" alt=\"\" width=\"300\" height=\"300\" \/><\/a><br \/>\nA parte mais interessante do Docker \u00e9 a possibilidade de integra\u00e7\u00e3o com outras ferramentas. Isso \u00e9 poss\u00edvel gra\u00e7as ao API que ele disponibiliza para uso. Por ela \u00e9 poss\u00edvel executar exatamente as mesmas coisas do que a CLI, visto que a CLI \u00e9 apenas uma interface para a API. Tudo muito lindo, n\u00e9? Mas, mesmo assim, vamos ver como melhorar isso:<\/p>\n<ul>\n<li>Exponha somente se for realmente necess\u00e1rio. A API do Docker n\u00e3o possu\u00ed diversos recursos b\u00e1sicos de seguran\u00e7a, ent\u00e3o exponha ela apenas em casos realmente necess\u00e1rios.<\/li>\n<li>Opte sempre por um \u201cproxy\u201d para se comunicar com a API, dessa forma voc\u00ea pode prover alguns recursos, como certificado SSL e autentica\u00e7\u00e3o b\u00e1sica<\/li>\n<li>Tenha cuidado com qual vers\u00e3o est\u00e1 utilizando, como os par\u00e2metros podem mudar de vers\u00e3o para vers\u00e3o, n\u00e3o use a latest, opte sempre por especificar uma vers\u00e3o. Com isso voc\u00ea garante que suas chamadas retornar\u00e3o o esperado.<\/li>\n<\/ul>\n<h1>Rede<\/h1>\n<p><a href=\"https:\/\/blog.umbler.com\/wp-content\/uploads\/2018\/01\/rede-de-dormir-descanso-casal-brinde-a-preco-de-fabrica-D_NQ_NP_877988-MLB26060153797_092017-O.jpg\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter\" src=\"https:\/\/blog.umbler.com\/wp-content\/uploads\/2018\/01\/rede-de-dormir-descanso-casal-brinde-a-preco-de-fabrica-D_NQ_NP_877988-MLB26060153797_092017-O-300x229.jpg\" alt=\"\" width=\"300\" height=\"229\" \/><\/a><br \/>\nRede \u00e9 mais um componente no ambiente todo que o Docker prov\u00ea para voc\u00ea executar suas aplica\u00e7\u00f5es de forma isolada. Em ambiente de desenvolvimento o impacto \u00e9 bem menor, mas se for pensar em utilizar Docker na produ\u00e7\u00e3o, existem alguns pontos que voc\u00ea deve levar em considera\u00e7\u00e3o:<\/p>\n<ul>\n<li>A bridge default do Docker permite que voc\u00ea crie at\u00e9 1024 containers, esta \u00e9 uma limita\u00e7\u00e3o do kernel do Linux e n\u00e3o do Docker. Caso voc\u00ea precise de mais, pense em utilizar o OpenvSwitch;<\/li>\n<li>Para ter um melhor isolamento entre os containers, pense em utilizar uma rede do Docker para cada Stack. Por exemplo: uma rede para o ambiente de api e banco que ela utiliza, e outra rede para o site e outro banco.<\/li>\n<li>Caso voc\u00ea deseje ter um cluster (usando Swarm, por exemplo), tente utilizar uma interface para o cluster e outra para acessos externos aos servi\u00e7os;<\/li>\n<li>Quando poss\u00edvel, utilize um servi\u00e7o de IPAM externo para gerenciar melhor os recursos de IP dentro do host ou cluster.<\/li>\n<\/ul>\n<h1>Seguran\u00e7a<\/h1>\n<p><a href=\"https:\/\/blog.umbler.com\/wp-content\/uploads\/2018\/01\/seguranca.jpg\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter\" src=\"https:\/\/blog.umbler.com\/wp-content\/uploads\/2018\/01\/seguranca-300x285.jpg\" alt=\"\" width=\"300\" height=\"285\" \/><\/a><br \/>\nOlha que louco, n\u00e3o falaremos sobre seguran\u00e7a, mas isso \u00e9 por um motivo \u00f3bvio. Em cada um dos itens, h\u00e1 algum ponto que fala sobre seguran\u00e7a, refor\u00e7o isso pois seguran\u00e7a, independente do ambiente, tem que ser algo natural, e n\u00e3o algo externo a ser feito. Se, em cada ponto do ambiente for tratado seguran\u00e7a, no final das contas estaremos com o ambiente todo seguro. L\u00f3gica ineg\u00e1vel, correto?<\/p>\n<p>Existem muitos outros pontos que voc\u00ea pode estar com d\u00favidas, isso \u00e9 natural e at\u00e9 mesmo esperado. Por isso, se voc\u00ea tem algo para contribuir n\u00e3o deixe de nos avisar, combinado?<\/p>\n<p>Por ora, era isso, Abra\u00e7o!<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Oi gente, tudo bem? Vamos ao quarto post da nossa s\u00e9rie! Hoje vamos conversar um pouco sobre coisas que voc\u00ea deve e deve fazer se quiser trabalhar com containers. A gente j\u00e1 viu: O que \u00e9 container, j\u00e1 aprendemos a instalar o Docker e j\u00e1 sabemos como containerizar nossas aplica\u00e7\u00f5es. Certo? Ent\u00e3o, nada melhor do [&hellip;]<\/p>\n","protected":false},"author":3,"featured_media":5229,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[23],"tags":[279,280,287],"class_list":["post-3387","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-dev","tag-containers","tag-docker","tag-dockerfile"],"_links":{"self":[{"href":"https:\/\/blog.umbler.com\/br\/wp-json\/wp\/v2\/posts\/3387"}],"collection":[{"href":"https:\/\/blog.umbler.com\/br\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/blog.umbler.com\/br\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/blog.umbler.com\/br\/wp-json\/wp\/v2\/users\/3"}],"replies":[{"embeddable":true,"href":"https:\/\/blog.umbler.com\/br\/wp-json\/wp\/v2\/comments?post=3387"}],"version-history":[{"count":0,"href":"https:\/\/blog.umbler.com\/br\/wp-json\/wp\/v2\/posts\/3387\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/blog.umbler.com\/br\/wp-json\/wp\/v2\/media\/5229"}],"wp:attachment":[{"href":"https:\/\/blog.umbler.com\/br\/wp-json\/wp\/v2\/media?parent=3387"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/blog.umbler.com\/br\/wp-json\/wp\/v2\/categories?post=3387"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/blog.umbler.com\/br\/wp-json\/wp\/v2\/tags?post=3387"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}