<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Tarcísio Corte</title>
    <description>The latest articles on DEV Community by Tarcísio Corte (@tarcisio).</description>
    <link>https://dev.to/tarcisio</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F776932%2F2a90c1d0-e693-4409-abcb-4eb2eee378b6.png</url>
      <title>DEV Community: Tarcísio Corte</title>
      <link>https://dev.to/tarcisio</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/tarcisio"/>
    <language>en</language>
    <item>
      <title>Docker: Simplicidade e praticidade - Parte 2</title>
      <dc:creator>Tarcísio Corte</dc:creator>
      <pubDate>Tue, 11 Jan 2022 14:27:03 +0000</pubDate>
      <link>https://dev.to/tarcisio/docker-simplicidade-e-praticidade-parte-2-oal</link>
      <guid>https://dev.to/tarcisio/docker-simplicidade-e-praticidade-parte-2-oal</guid>
      <description>&lt;p&gt;Na &lt;a href="https://dev.to/tarcisio/docker-simplicidade-e-praticidade-parte-1-26b0"&gt;parte 1&lt;/a&gt; dessa série de posts, eu mostrei como baixar a imagem de um container, depois mostrei como &lt;em&gt;montar&lt;/em&gt; um container, apagar esse container e por ultimo como deletar a imagem.&lt;/p&gt;

&lt;p&gt;Neste post eu começo mostrando como montar uma imagem.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Melhor que isso, vou mostrar como &lt;strong&gt;&lt;em&gt;dockerizar&lt;/em&gt;&lt;/strong&gt;&lt;br&gt;
 uma aplicação Angular, ou seja uma imagem que roda uma aplicação Angular.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h4&gt;
  
  
  Cenário: Dockerizar uma aplicação Angular com Nginx
&lt;/h4&gt;

&lt;p&gt;Já vou deixar &lt;a href="https://github.com/tarcisiocorte/dockerizar-app-angular" rel="noopener noreferrer"&gt;código fonte&lt;/a&gt; pronto aqui que ai já fica mais fácil pra quem quiser estudar.&lt;/p&gt;

&lt;p&gt;Na raiz da aplicação Angular, crie um arquivo Dockerfile.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;# Primeiro passo: compilar e builder código Angular
FROM node:14.17.0 as build
WORKDIR /usr/local/app
COPY ./ /usr/local/app/
RUN npm install
RUN npm run build

# Segundo passo: usar o nginx como server
FROM nginx:latest
COPY --from=build /usr/local/app/dist/app-demo /usr/share/nginx/html

# Exportar a porta 80 que é padrão
EXPOSE 80

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Tenha em mente aqui que você precisa do NodeJs e Angular instalados na sua máquina para gerar essa imagem.&lt;br&gt;
No meu caso, instalados nesse momento eu tenho o NodeJs v14.17.0 e Angular v12.0.5.&lt;br&gt;
Agora, vamos rodar o comando para gerar a imagem.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;docker build -t app-demo:v1 .
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Detalhe: podemos, ao invés de ter um arquivo chamado Dockerfile, poderiamos ter um arquivo chamado dev.dockerfile e outro qa.dockerfile ou/e também mais um chamado prod.dockerfile, então poderia executar o mesmo comando, mas para um arquivo especifico:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;docker build -t app-demo:v1 ./qa.dockerfile
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Imagem pronta, então vamos rodar esse container.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;docker run -d -p 8080:80 app-demo:v1
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;No comando acima, estamos rodando o container e direcionamos a porta 80 do container para a porta 8080 da máquina que esta rodando o container.&lt;br&gt;
Abra o navegador e digite o endereço &lt;code&gt;http://localhost:8080/&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F9pciamanxr46gswlh1bx.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F9pciamanxr46gswlh1bx.png" alt="Image description"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Conclusão
&lt;/h3&gt;

&lt;p&gt;Nessa continuação de uma série de posts, fiz novamente a demonstração de como é fácil criar containers Docker.&lt;br&gt;
Usar arquivos Dockerfiles é sem dúvida uma das maneiras mais praticas e fáceis de se instanciar containers.&lt;/p&gt;

</description>
      <category>angular</category>
      <category>docker</category>
      <category>tutorial</category>
    </item>
    <item>
      <title>Docker: Simplicidade e praticidade - Parte 1</title>
      <dc:creator>Tarcísio Corte</dc:creator>
      <pubDate>Wed, 29 Dec 2021 19:47:04 +0000</pubDate>
      <link>https://dev.to/tarcisio/docker-simplicidade-e-praticidade-parte-1-26b0</link>
      <guid>https://dev.to/tarcisio/docker-simplicidade-e-praticidade-parte-1-26b0</guid>
      <description>&lt;h2&gt;
  
  
  Um guia de sobrevivência - Parte 1
&lt;/h2&gt;

&lt;p&gt;Criar uma máquina virtual e instalar nela tudo que você precisa, seja essa maquina um ambiente de produção, qualidade ou desenvolvimento é muito bom. Então, esqueça máquinas pesadas com vários gigabytes de disco ou RAM, temos imagens pequenas e mínimas que podem ser executadas como containers e te ajudar muito no seu dia.&lt;/p&gt;

&lt;p&gt;Essa é a primeira parte de um guia de sobrevivência para montar imagens, containers, fazer pull e push para um repositório, criar Dockerfile, Docker Compose etc.&lt;/p&gt;

&lt;p&gt;Docker é claro é a ferramenta que vou usar. &lt;br&gt;
Dizem que existem outras, mas qual?&lt;/p&gt;
&lt;h4&gt;
  
  
  Cenário: Quero rodar um container.
&lt;/h4&gt;

&lt;p&gt;Por exemplo, rodar um container com um banco de dados.&lt;br&gt;
1 - Baixar uma imagem:&lt;code&gt;docker pull&lt;/code&gt;. Esse comando é especifico para baixar uma imagem. Veja o exemplo a seguir:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;docker pull mysql/mysql-server:latest 
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Faz o download da uma versão da imagem do MySQL.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;docker images
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Lista as imagens que estão disponíveis no seu computador.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fsg0uekclweexneguv6oi.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fsg0uekclweexneguv6oi.png" alt="Imagens que tenho disponível em meu computador"&gt;&lt;/a&gt;&lt;br&gt;
2 - Montar e rodar um container&lt;br&gt;
Agora que você já tem uma imagem oficial, põe ela pra rodar. Use o comando &lt;code&gt;docker run&lt;/code&gt;.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;docker run --name="mysqltest" -d mysql/mysql-server:latest  
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Pronto, já tem um container rodando.&lt;br&gt;
Use o comando &lt;code&gt;docker container ls&lt;/code&gt; para listar os containers.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fismfmf0vu8p208gs33i4.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fismfmf0vu8p208gs33i4.png" alt="Container listado através do comando docker container ls"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h4&gt;
  
  
  Cenário: Quero remover os containers e imagens.
&lt;/h4&gt;

&lt;p&gt;1 - Parar o container&lt;br&gt;
Para "stopar" container use o comando &lt;code&gt;docker kill&lt;/code&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt; docker kill $(docker ps -q)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;No exemplo acima é executado um comando que "stopa" todos os containers que estão rodando no momento.&lt;br&gt;
No caso do exemplo abaixo, só havia um container em execução na minha maquina.&lt;br&gt;
&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fchg9o8kbpq99compuq3e.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fchg9o8kbpq99compuq3e.png" alt="Container parado por ação do comando acima"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;2 - Remover as imagens&lt;br&gt;
Para remover as imagens que estão na sua máquina use o comando &lt;code&gt;docker rmi&lt;/code&gt;, veja exemplo:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;docker rmi $(docker images -a -q) -f
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Ao executar esse comando você deve receber uma mensagem como essa:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Untagged: mysql/mysql-server:latest
Untagged: mysql/mysql-server@sha256:91170bd4e012f0bf46b5141a38b612427b37692e8465cdffe9b0ca2d74d37d8a
Deleted: sha256:d2e6e9727b37928be30fb11361d1246dcc816e6b5fb55d6ef30281ff5e3884df

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Conclusão
&lt;/h3&gt;

&lt;p&gt;Neste post eu mostrei como é simples baixar imagens e executar containers baseados nessas imagens.&lt;br&gt;
No &lt;a href="https://hub.docker.com/" rel="noopener noreferrer"&gt;Docker Hub&lt;/a&gt; você encontra milhares e milhares de imagens prontas que você pode usar de imediato.&lt;br&gt;
No próximo post vou mostrar mais sobre a iteração com esses containers e como tirar mais proveito durante a execução. &lt;/p&gt;

&lt;p&gt;Link do &lt;a href="https://hub.docker.com/r/mysql/mysql-server" rel="noopener noreferrer"&gt;MySQL&lt;/a&gt; no Docker Hub&lt;br&gt;
Link do &lt;a href="https://hub.docker.com/_/nginx" rel="noopener noreferrer"&gt;Nginx&lt;/a&gt; no Docker Hub&lt;/p&gt;

</description>
      <category>docker</category>
      <category>devops</category>
      <category>container</category>
    </item>
    <item>
      <title>NestJS: Pode usar mais e mais!</title>
      <dc:creator>Tarcísio Corte</dc:creator>
      <pubDate>Mon, 27 Dec 2021 19:36:03 +0000</pubDate>
      <link>https://dev.to/tarcisio/nestjs-pode-usar-mais-e-mais-4lh9</link>
      <guid>https://dev.to/tarcisio/nestjs-pode-usar-mais-e-mais-4lh9</guid>
      <description>

&lt;p&gt;Venho trabalhando com NestJS em meus projetos pessoais desde 2019, basicamente são projetos para expor pequenas APIs que servem a alguns poucos e pequenos sites.&lt;br&gt;
Recentemente tive a oportunidade de compor um time que estava usando NestJS de uma forma muito séria e fizemos a implementação de uma API muito robusta que esta escalando mais e mais.&lt;br&gt;
Estou muito satisfeito com o resultado que o NestJS tem nos proporcionado e isso me motivou a fazer esses post.&lt;/p&gt;
&lt;h2&gt;
  
  
  O que é NestJS
&lt;/h2&gt;

&lt;p&gt;Framework de NodeJs que possibilita aos desenvolvedores de TypeScript e JavaScript criar aplicações eficientes e capazes de escalar de maneira muito simples e rápida.&lt;br&gt;
Escrevi TypeScript antes de JavaScript porque o NestJS é TypeScript first ou seja, todo o desenvolvimento é baseado em TypeScript mas é claro você ainda pode usar JavaScript (fique à lá vonté).&lt;br&gt;
Um detalhe sobre o NestJS, "por baixo dos panos" NestJS faz uso do nosso querido Express. Você não é obrigado usar o Express, você pode trocar por Fastify. Esse é um post padrão, então vai seguir com o Express no exemplo!&lt;/p&gt;
&lt;h4&gt;
  
  
  Vamos ao tutorial
&lt;/h4&gt;

&lt;p&gt;Primeiramente, vamos instalar e fazer uso da &lt;a href="https://docs.nestjs.com/cli/overview"&gt;Nest CLI&lt;/a&gt; que é um command-line que vai nos ajudar a inicializar o projeto, nos ajuda no desenvolvimento e a manter o projeto também.&lt;br&gt;
&lt;code&gt;$ npm i -g @nestjs/cli&lt;br&gt;
 $ nest new project-name&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Como demonstração neste post vamos criar uma API para registro de contatos.&lt;br&gt;
Execute o comando:&lt;br&gt;
&lt;code&gt;nest new api-contact&lt;/code&gt;&lt;br&gt;
Quando aparecer a pergunta - Which package manager would you ❤️ use? - selecione "npm".&lt;br&gt;
Navega até a pasta:&lt;br&gt;
&lt;code&gt;cd api-contact&lt;/code&gt;&lt;br&gt;
Você verá a seguinte estrutura inicial do projeto:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--hfJ_lOhb--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/nd0rrmfy8teau2b0fnuw.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--hfJ_lOhb--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/nd0rrmfy8teau2b0fnuw.png" alt="Estrutura básica de um projeto criado com Nest CLI" width="488" height="604"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;O scaffolding do NestJS já traz vários arquivos de projetos que nos ajudam muito durante o desenvolvimento.&lt;/p&gt;

&lt;p&gt;Uma coisa, antes de começar a codificar, vamos adicionar o &lt;a href="https://github.com/nestjs/typeorm"&gt;TypeORM&lt;/a&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;npm i --save @nestjs/typeorm typeorm
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;Agora que já temos a dependência do TypeORM instalado, vamos criar nossa primeira entidade.&lt;br&gt;
Crie um arquivo chamado &lt;strong&gt;&lt;em&gt;contact.entity.ts&lt;/em&gt;&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;
&lt;div class="ltag_gist-liquid-tag"&gt;
  
&lt;/div&gt;



&lt;p&gt;Agora vamos fazer uma de uma DTO que será usada para salvar os registros de contatos, então crie o arquivo &lt;strong&gt;&lt;em&gt;CreateContact.dto.ts&lt;/em&gt;&lt;/strong&gt;:&lt;br&gt;
&lt;/p&gt;
&lt;div class="ltag_gist-liquid-tag"&gt;
  
&lt;/div&gt;


&lt;p&gt;Não vou falar hoje sobre padrão Service Repository, mas pra quem conhece esse conceito vai identificar isso muito fácil no NestJS.&lt;br&gt;
Crie o arquivo &lt;strong&gt;&lt;em&gt;contacts.service.ts&lt;/em&gt;&lt;/strong&gt;:&lt;br&gt;
&lt;/p&gt;
&lt;div class="ltag_gist-liquid-tag"&gt;
  
&lt;/div&gt;


&lt;p&gt;Obviamente a repository do exemplo salva dados em um banco de dados.&lt;br&gt;
Vou fornecer aqui as configurações que eu usei para o PostgreSQL. Para isso usei o arquivo &lt;strong&gt;&lt;em&gt;app.module.ts&lt;/em&gt;&lt;/strong&gt; que é padrão já fornecido pelo scaffolding do NestJS:&lt;/p&gt;


&lt;div class="ltag_gist-liquid-tag"&gt;
  
&lt;/div&gt;


&lt;p&gt;Pra facilitar a vida de quem acompanha esse post vou deixar o  arquivo &lt;strong&gt;&lt;em&gt;docker-compose.yml&lt;/em&gt;&lt;/strong&gt; disponível para quem tem interesse de já rodar a imagem de um PostgreSQL e testar a API.&lt;br&gt;
&lt;/p&gt;
&lt;div class="ltag_gist-liquid-tag"&gt;
  
&lt;/div&gt;


&lt;p&gt;Até aqui eu só mostrei o exemplo do código de produção, ou seja o código que necessitamos para rodar a API de forma funcional.&lt;br&gt;
Agora, vamos ver a parte do código que corresponde aos Testes Unitários.&lt;/p&gt;

&lt;p&gt;Por padrão o NestJS já cria um arquivo de teste que vem junto com o scaffolding.&lt;/p&gt;

&lt;p&gt;Para esse exemplo vou deixar o código de testes unitários que usei para testar a nossa service, então veja o código do arquivo &lt;strong&gt;&lt;em&gt;contacts.service.spec.ts&lt;/em&gt;&lt;/strong&gt;:&lt;br&gt;
&lt;/p&gt;
&lt;div class="ltag_gist-liquid-tag"&gt;
  
&lt;/div&gt;


&lt;p&gt;Eu implementei alguns poucos testes, porém o que eu quero demonstrar é a facilidade que temos em montar nossos testes unitários com Jest e NestJS.&lt;br&gt;
Veja como é fluída a codificação dos testes.&lt;/p&gt;

&lt;p&gt;Código completo do exemplo no ❤️Github, &lt;a href="https://github.com/tarcisiocorte/app-demo-nest"&gt;onde tudo esta&lt;/a&gt;!&lt;/p&gt;

&lt;p&gt;Conclusão&lt;br&gt;
NestJS é um framework muito estável e de fácil adoção em aplicações de todos os níveis de complexidade isso porque ele é muito simples de se usar e também porque Nest CLI já te serve uma ótima estrutura de código para começo de projeto e de fácil alteração e evolução.&lt;/p&gt;

</description>
      <category>nestjs</category>
      <category>typescript</category>
      <category>node</category>
      <category>javascript</category>
    </item>
  </channel>
</rss>
