By Sails.js Tech Brasil

Sails.js com Dockerfile

Em termos gerais, Sails.js é um gerador de códigos JavaScript que entrega, em poucos minutos, um protótipo executável de uma Aplicação WEB do tipo backend robusta, segura e escalável. Diz-se backend porque todo o processamento ocorre do lado do servidor e depois disso é retornado ao navegador páginas HTML5 + CSS + JavaScript dinâmicas ao Cliente Web.

A versão final de sua Aplicação WEB precisará ser lançada em um servidor especial (ambiente de produção) que garanta sua execução com segurança e desempenho dignos. Uma forma de fazer isso é o lançamento Em container Docker.
Docker é uma plataforma de software de código aberto que permite implantar aplicativos dentro de containers virtuais. A conteinerização permite que vários aplicativos funcionem em diferentes ambientes complexos. Por exemplo, o Docker permite executar o WordPress em sistemas Windows, Linux e macOS, sem problemas. A tecnologia de container do Docker é mais leve e portátil do que as máquinas virtuais. Embora o Docker e as máquinas virtuais tenham um propósito semelhante, seu desempenho, portabilidade e suporte a sistemas operacionais diferem significativamente. O Docker é uma das plataformas de containers mais populares sendo usada por muitas empresas para implantar aplicativos em diferentes sistemas.

Este passo-a-passo demonstra como utilizar o Docker como solução de Container em sincronia com as funcionalidades do Sails.js no backend.

Se esta é sua primeira vez aqui, recomendamos a leitura dos conteúdos abaixo antes de continuar:


Pré-requisitos

Primeira Etapa: Protótipo Raiz (5 min)
  1. Instalação do Sails.js: visite Passo a passo para um novo Protótipo Sails.js para instalar seu primeiro protótipo
  2. Se tudo deu certo na instalação e uma nova página se abriu, então continue na próxima etapa

Segunda Etapa: criação do arquivo Docker

O Dockerfile é um arquivo de texto simples que contém todas as instruções necessárias para criar uma imagem Docker. Com ele, você pode criar imagens personalizadas que contêm tudo o que seu aplicativo precisa para ser executado, incluindo o sistema operacional, bibliotecas, dependências e código do aplicativo. O Dockerfile é uma parte crucial do processo de criação de imagens Docker. É usado para automatizar a construção de imagens e garantir que as imagens resultantes sejam consistentes e facilmente replicáveis. Ou seja, trata-se de uma ferramenta poderosa que permite aos desenvolvedores criar e gerenciar imagens personalizadas do Docker de forma fácil e eficiente.

  1. Crie na raiz do seu protótipo Sails um arquivo somente texto de nome Dockerfile, sem nenhuma extensão.
  2. Adicione neste arquivo o seguinte conteúdo:
    
    # Este arquivo Dockerfile foi preparado para construcao de
    # uma imagem de container Docker (https://docs.docker.com/guides/get-started/)
    # pronta para execucao de uma aplicacao Sails.js (https://www.sails.js)
    # em ambiente de producao.
    
    # Atenção! Estamos considerando que tu tens conhecimento minimo para:
    # a) Instalar um servico Docker no computador;
    # b) Executar o comando docker pull node:versao
    # c) Executar o comando $docker build -t .
    # d) Executar o comando $docker run -d -p 80:80 --ip localhost [image_id da imagem gerada]
    
    # Antes de executar este Dockerfile, certifique-se de que:
    # 1) no arquivo config/env/production.js do Protótipo Sails criado, já foi autorizado o acesso:
    #        onlyAllowOrigins: [
    #            'http://localhost', <-- endereco final do app em producao
    #        ],
    #
    # 2) no arquivo config/env/production.js, já foi definida a porta 80:
    #
    #        port: 80,
    #
    # 3) no arquivo config/env/production.js ou no config/custom.js, já foi definido
    #    explicitamente o endereco base:
    #        custom: {
    #           baseUrl: 'http://localhost', <-- endereco final do app em producao
    #           internalEmailAddress: 'support@example.com',
    #           ...
    #
    #
    
    # A escolha da imagem Docker deve ser feita de acordo com a versao
    # do Node.js que o desenvolvedor utilizou quando o app foi criado,
    # pois toda a definicao de bibliotecas constante do aquivo package.json
    # durante a criacao do prototipo dependeu disso.
    # Para saber qual versao do Node.js foi utilizada pelo 'motor gerador'
    # do codigo, localize, no arquivo package.json, a seguinte entrada:
    #   "engines": {
    #       "node": "^16.15" <-- versao do Node.js utilizada para instalacao
    #    }
    #
    
    # Para instalar a imagem mais atualizada...
    # FROM registry.ccarj.intraer/mirror/library/node:lts-alpine AS build
    # Para instalar a imagem compativel com a versao de 'geracao' do app
    # FROM node:16.15.1 AS build
    
    FROM node:16.15.1 AS build
    
    # Definicao do diretorio de trabalho
    WORKDIR /usr/local/app
    
    # Transferencia do codigo fonte para a imagem
    COPY ./ /usr/local/app/
    
    # Instalacao de todas as dependencias
    RUN npm install
    
    # Atribuicao de permissoes de execucao
    USER node
    COPY . .
    COPY --chown=node:node . .
    
    # Exposicao da porta 80
    EXPOSE 80:80
    
    # Execucao em ambiente de producao
    ENV NODE_ENV=production
    CMD [ "node", "./app.js" ]
    
    
                

Terceira Etapa: Criação da Imagem do Aplicativo (5 min)
  1. Na raiz do Protótipo, digite docker build -t sails .
  2. Para consultar a imagem gerada no container, digite: docker images. Tú deves visualizar algo como:
    sails                                      latest    ece424c79462   About a minute ago   1.28GB
    <none>                                     <none>    013a26c1f25a   36 minutes ago       1.28GB
    <none>                                     <none>    c8155314f684   2 hours ago          1.28GB
    <none>                                     <none>    2d0b6c440655   2 hours ago          1.28GB
    <none>                                     <none>    f794fe671dc1   2 hours ago          1.28GB
    <none>                                     <none>    3a00a11c6562   3 hours ago          1.29GB
    <none>                                     <none>    e7d9d17bbb88   3 hours ago          1.29GB
    <none>                                     <none>    fa5014bfabe8   3 hours ago          1.29GB
    <none>                                     <none>    29dc685bd58b   3 hours ago          1.29GB
    mongo                                      latest    9b10bdf158d5   3 weeks ago          757MB
    node                                       16.15.1   b9f398d30e45   18 months ago        907MB
            
  3. Verifique se uma nova imagem foi gerada recentemente. Esta deve ser sua imagem.
  4. Se tudo funcionou bem, passe para a próxima etapa.

Quarta Etapa: Execução da Aplicação Sails.js como imagem (5 min)
  1. Digite docker run -d -p 80:80 [--ip meuendereco] <image_id da imagem gerada>
  2. Opcionalmente, para 'subir' a aplicação em outra porta, utilize docker run -d -p 1337:80 sails new .
  3. Espera um pouco! O Docker vai responder que tudo está OK, mas a aplicação ainda está 'subindo' no Servidor, então é melhor esperar um minutinho.
  4. Agora abra o navegador e digite http://localhost(ou o endereço final que você definiu no arquivo production.js) citado acima
  5. Se tudo correu bem, você verá algo do tipo...
    homepage

Quinta Etapa: O que fazer com minha imagem Docker?

Execute o Docker na AWS

A AWS oferece suporte para soluções comerciais e de código aberto do Docker. Existem várias maneiras de executar contêineres na AWS, incluindo o Amazon Elastic Container Service (ECS), que é um serviço de gerenciamento de contêiner altamente escalável e de alta performance. Os clientes podem implantar facilmente as aplicações conteinerizadas a partir do ambiente local do Docker diretamente no Amazon ECS. O AWS Fargate é uma tecnologia para o Amazon ECS que permite executar contêineres em produção sem implantar ou gerenciar a infraestrutura. O Amazon Elastic Container Service for Kubernetes (EKS) facilita a execução do Kubernetes na AWS. O AWS Fargate é uma tecnologia para o Amazon ECS que permite executar contêineres sem provisionar ou gerenciar servidores. O Amazon Elastic Container Registry (ECR) é um repositório privado de contêineres altamente disponível e seguro que facilita o armazenamento e o gerenciamento de imagens do contêiner do Docker, criptografando e compactando imagens em repouso, para que sejam fáceis de capturar e proteger. O AWS Batch permite executar cargas de trabalho de processamento em lote altamente escaláveis usando contêineres do Docker.


Cloud Build

O Cloud Build é um serviço que executa suas versões no Google Cloud.
O Cloud Build pode importar o código-fonte de uma variedade de repositórios ou espaços do Cloud Storage, executar uma versão para suas especificações e produzir artefatos como contêineres Docker ou arquivos Java.


Serviço de Kubernet da Azure (AKS)

O Serviço de Kubernetes do Azure (AKS) oferece a maneira mais rápida de começar a desenvolver e implantar aplicativos nativos de nuvem no Azure, em datacenters ou na borda com pipelines internos do código para a nuvem e verificadores de integridade. Obtenha gerenciamento e governança unificados para clusters do Kubernetes locais, de borda e multinuvem. Interopere com os serviços de segurança, identidade, gerenciamento de custos e migração do Azure.


Heroku Sailsforce

O Serviço Heroku da Sailsforce oferece duas formas de realizar lançamento de software com Docker:

Início