{"id":10670,"date":"2016-12-20T10:12:07","date_gmt":"2016-12-20T12:12:07","guid":{"rendered":"https:\/\/king.host\/blog\/?p=10670"},"modified":"2024-06-04T07:09:40","modified_gmt":"2024-06-04T10:09:40","slug":"utilizando-docker-para-escalonar-aplicacoes-node-js","status":"publish","type":"post","link":"https:\/\/king.host\/blog\/tecnologia\/utilizando-docker-para-escalonar-aplicacoes-node-js\/","title":{"rendered":"Utilizando Docker para escalonar aplica\u00e7\u00f5es Node.Js"},"content":{"rendered":"<p>Ao iniciar um projeto, \u00e9 muito importante conhecer os requisitos do sistema, bem como saber qual carga de acesso que ele deve suportar. O <strong><a href=\"https:\/\/www.kinghost.com.br\/node-js\" target=\"_blank\" rel=\"noopener\">Node.JS<\/a><\/strong> \u00e9 uma \u00f3tima solu\u00e7\u00e3o para criar aplica\u00e7\u00f5es onde ocorrem entrada e sa\u00edda de muitos dados, pois possui uma grande facilidade de escalonamento horizontal. Neste artigo, vamos demonstrar como configurar o ambiente de desenvolvimento para a cria\u00e7\u00e3o de projetos escalon\u00e1veis com o Docker. Utilizando essa plataforma aberta, \u00e9 poss\u00edvel realizar deploys e escalonar aplica\u00e7\u00f5es com tranquilidade. Al\u00e9m disso, o Docker providencia um ambiente isolado e leve para sua aplica\u00e7\u00e3o, gra\u00e7as \u00e0 virtualiza\u00e7\u00e3o por containers.<\/p>\n<p>A grande diferen\u00e7a entre a virtualiza\u00e7\u00e3o por containers e a de uma VM (Virtual Machine) \u00e9 o consumo de espa\u00e7o e recursos utilizados pela m\u00e1quina. O motivo dessa disparidade \u00e9 o fato de a VM emular o hardware de uma m\u00e1quina utilizando uma camada denominada hypervisor, enquanto um container faz a virtualiza\u00e7\u00e3o pelo pr\u00f3prio sistema operacional. Em outras palavras, um container faz o agrupamento e o isolamento de recursos. Tudo o que est\u00e1 dentro de um container n\u00e3o enxerga o que est\u00e1 fora (Host).<\/p>\n<p>A virtualiza\u00e7\u00e3o por container j\u00e1 existe h\u00e1 algum tempo, mas o Docker acrescenta um grande diferencial ao processo. No Docker, cada imagem cont\u00e9m v\u00e1rias camadas, sendo assim, ele utiliza o UnionFS para reunir todas as camadas. Esse \u00e9 um processo que concede rapidez, pois n\u00e3o h\u00e1 a necessidade de fazer rebuild para atualizar as imagens.<\/p>\n<p>Dito isso, vamos configurar um ambiente em Docker para uma aplica\u00e7\u00e3o NodeJs. Um proxy reverso na frente das inst\u00e2ncias da aplica\u00e7\u00e3o \u00e9 uma das configura\u00e7\u00f5es padr\u00e3o que vamos utilizar. N\u00e3o ser\u00e1 necess\u00e1rio realizar qualquer tipo de configura\u00e7\u00e3o manual. Gra\u00e7as \u00e0 comunidade, as imagens j\u00e1 est\u00e3o prontas, sendo necess\u00e1rio apenas realizar pequenos ajustes para sua aplica\u00e7\u00e3o rodar. Para iniciar o proxy (vamos assumir que voc\u00ea j\u00e1 tenha instalado o Docker), basta executar o seguinte comando:<\/p>\n<div id=\"highlighter_747971\" class=\"syntaxhighlighter notranslate \">\n<div class=\"lines no-wrap\">\n<div class=\"line alt1\">\n<table>\n<tbody>\n<tr>\n<td class=\"number\"><code>1<\/code><\/td>\n<td class=\"content\"><code class=\"plain\">$ docker run -d -p 80:80 -v \/var\/run\/docker.sock:\/tmp\/docker.sock -t jwilder\/nginx-proxy<\/code><\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/div>\n<\/div>\n<\/div>\n<p>Ao executar o \u201crun\u201d, o daemon do Docker ir\u00e1 procurar pela imagem \u201cjwilder\/nginx-proxy\u201d na sua m\u00e1quina. Caso n\u00e3o encontre, ele ir\u00e1 baixar diretamente do Docker Hub. O comando \u201c-v \/var\/run\/docker.sock:\/tmp\/docker.sock\u201d faz com que os dois arquivos fiquem sincronizados, tanto no host quanto no container. Mais informa\u00e7\u00f5es sobre a imagem voc\u00ea pode verificar no link <a href=\"https:\/\/hub.docker.com\/r\/jwilder\/nginx-proxy\/\" target=\"_blank\" rel=\"noopener\">https:\/\/hub.docker.com\/r\/jwilder\/nginx-proxy\/<\/a>. Agora \u00e9 poss\u00edvel subir o container da aplica\u00e7\u00e3o com o seguinte comando:<\/p>\n<div id=\"highlighter_728821\" class=\"syntaxhighlighter notranslate \">\n<div class=\"lines no-wrap\">\n<div class=\"line alt1\">\n<table>\n<tbody>\n<tr>\n<td class=\"number\"><code>1<\/code><\/td>\n<td class=\"content\"><code class=\"plain\">$ docker run -d -e VIRTUAL_HOST=&lt;HostDoSeuApp&gt; --expose 8888 -v \"&lt;CaminhoDoSeuApp&gt;\":\/usr\/src\/app -w \/usr\/src\/app node:4.4 node index.js<\/code><\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/div>\n<\/div>\n<\/div>\n<p>Esse comando \u00e9 similar ao primeiro, sendo a passagem da vari\u00e1vel VIRTUAL_HOST a diferen\u00e7a-chave para o funcionamento dessa configura\u00e7\u00e3o. O comando deve conter o host que aponta para sua m\u00e1quina \u2013 essa vari\u00e1vel \u00e9 utilizada para a configura\u00e7\u00e3o do proxy. Ser\u00e1 necess\u00e1rio deixar a porta em que o servidor node est\u00e1 rodando aberta para o host (comando \u201c\u2013expose\u201d).<\/p>\n<p>Com isso, voc\u00ea tem seu ambiente pronto para ser executado localmente ou em produ\u00e7\u00e3o. Al\u00e9m disso, voc\u00ea pode executar o comando para iniciar outro container da aplica\u00e7\u00e3o e, assim, escalar mais inst\u00e2ncias.<\/p>\n<p>O Docker possui um sistema de versionamento de imagens pelo Docker Hub. Assim, se o autor da imagem fizer alguma atualiza\u00e7\u00e3o na configura\u00e7\u00e3o da imagem, ele pode fazer um <em>commit <\/em>e um <em>push<\/em>. Da mesma forma, as pessoas que possuem a imagem podem usar o comando <em>pull<\/em> para atualizar a sua vers\u00e3o. Al\u00e9m disso, \u00e9 poss\u00edvel realizar <em>rollbacks <\/em>em altera\u00e7\u00f5es efetuadas no container.<\/p>\n<p>Como foi demonstrado acima, \u00e9 poss\u00edvel realizar a configura\u00e7\u00e3o de ambientes de maneira simples e r\u00e1pida. Mesmo n\u00e3o sendo ainda recomendada a utiliza\u00e7\u00e3o dessa tecnologia (Docker) em produ\u00e7\u00e3o, acreditamos que seja muito importante o desenvolvimento do seu estudo. Consideramos que pelo poder de automa\u00e7\u00e3o, f\u00e1cil configura\u00e7\u00e3o e gerenciamento que o m\u00e9todo prop\u00f5e, em um futuro pr\u00f3ximo, ele far\u00e1 parte do desenvolvimento das aplica\u00e7\u00f5es web e servi\u00e7os cloud.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Ao iniciar um projeto, \u00e9 muito importante conhecer os requisitos do sistema, bem como saber qual carga de acesso que ele deve suportar. O Node.JS \u00e9 uma \u00f3tima solu\u00e7\u00e3o para criar aplica\u00e7\u00f5es onde ocorrem entrada e sa\u00edda de muitos dados, pois possui uma grande facilidade de escalonamento horizontal. Neste artigo, vamos demonstrar como configurar o [&hellip;]<\/p>\n","protected":false},"author":279,"featured_media":10672,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[1179,1327,8],"tags":[1355],"class_list":["post-10670","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-desenvolvimento","category-hospedagem-node-js","category-tecnologia","tag-nodejs"],"_links":{"self":[{"href":"https:\/\/king.host\/blog\/wp-json\/wp\/v2\/posts\/10670","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/king.host\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/king.host\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/king.host\/blog\/wp-json\/wp\/v2\/users\/279"}],"replies":[{"embeddable":true,"href":"https:\/\/king.host\/blog\/wp-json\/wp\/v2\/comments?post=10670"}],"version-history":[{"count":2,"href":"https:\/\/king.host\/blog\/wp-json\/wp\/v2\/posts\/10670\/revisions"}],"predecessor-version":[{"id":19278,"href":"https:\/\/king.host\/blog\/wp-json\/wp\/v2\/posts\/10670\/revisions\/19278"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/king.host\/blog\/wp-json\/wp\/v2\/media\/10672"}],"wp:attachment":[{"href":"https:\/\/king.host\/blog\/wp-json\/wp\/v2\/media?parent=10670"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/king.host\/blog\/wp-json\/wp\/v2\/categories?post=10670"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/king.host\/blog\/wp-json\/wp\/v2\/tags?post=10670"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}