Como Dockerizar um aplicativo Internet Node.js – CloudSavvy IT
[ad_1]
Docker é um plataforma de conteinerização que simplifica o empacotamento e execução de aplicativos. Os contêineres são executados como processos isolados com seu próprio sistema de arquivos, mas compartilham o kernel de seu host. O Docker ganhou destaque como uma forma de implementar ambientes de desenvolvimento reproduzíveis e arquiteturas de implantação distribuída.
Node.js é o líder em pace de execução JavaScript para desenvolvimento de back-end. A inicialização bem-sucedida de um serviço da Internet Node.js exige que você tenha um ambiente com o runtime instalado, o código do aplicativo disponível e um mecanismo que lide com reinicializações automáticas em caso de falha.
Neste guia, usaremos o Docker para colocar em contêiner um aplicativo Node.js simples criado com o in style Expressar estrutura internet. O Docker é uma boa maneira de implantar sistemas baseados em Node, pois produz um ambiente consistente que inclui tudo o que você precisa para executar seu serviço. O daemon do Docker tem suporte integrado para reiniciar contêineres com falha quando o processo em primeiro plano falha, resolvendo um dos desafios das implantações do Node.js.
Criando seu projeto de nó
Iremos pular os detalhes da implementação do seu aplicativo. Crie um diretório para seu projeto e adicione algum código de servidor dentro dele. Aqui está um básico app.js
que escuta na porta 8080 e responde a todas as solicitações com uma resposta codificada:
const specific = require("specific"); const app = specific(); app.get("*", (req, res) => res.ship("<p>It really works!</p>")); app.concentrate(8080, () => console.log("Listening on 8080"));
Adicione Specific ao seu projeto usando npm:
npm init npm set up --save specific
Inicie seu aplicativo para testar se funciona:
node app.js
Você deve poder visitar localhost:8080
em seu navegador para ver a resposta de amostra.
Escrevendo um Dockerfile
Agora é hora de começar a Dockerizar seu projeto. Primeiro você precisa de uma imagem para seu aplicativo. As imagens encapsulam seu código e dependências como um único pacote que você u.s.a. para iniciar instâncias de contêiner. As instruções em seu Dockerfile definem o estado do sistema de arquivos inicial de seus contêineres.
Aqui está um Dockerfile que funciona para o aplicativo de exemplo:
FROM node:16 WORKDIR /app COPY kit.json . COPY package-lock.json . RUN npm ci COPY app.js . CMD ["app.js"]
Este Dockerfile seleciona o imagem oficial do Node.js Docker como sua base através do FROM
declaração. A imagem herda tudo na base e adiciona conteúdo adicional por meio das instruções a seguir.
O diretório de trabalho é definido como /app
pelo WORKDIR
linha. A seguir COPY
declarações irão depositar arquivos no /app
diretório dentro da imagem do contêiner.
Instalando dependências
A próxima etapa é adicionar npm’s kit.json
e corra npm ci
. Isso instalará as dependências npm do seu projeto – Specific neste caso – dentro do sistema de arquivos do contêiner.
Não use COPY node_modules/ .
para copiar o existente node_modules
pasta no diretório do projeto – isso impediria que você reutilize o Dockerfile em outros ambientes de compilação. Os Dockerfiles devem permitir que você crie compilações consistentes apenas com o conteúdo do seu repositório de controle de origem. Se um arquivo ou pasta estiver em seu .gitignore
não deve ser referenciado em um Dockerfile COPY
instrução.
Copiando o código do aplicativo
Depois de npm ci
for executado, o código do seu aplicativo será copiado para a imagem. A colocação deste COPY
instrução após o RUN
, separando-o das cópias anteriores, é deliberado. Cada instrução cria uma nova camada em sua imagem; O processo de compilação do Docker armazena em cache cada camada para acelerar as compilações subsequentes. Assim que o conteúdo de uma camada for alterado, o cache de todas as camadas seguintes será invalidado.
É por isso que o código do aplicativo deve ser copiado após npm ci
foi executado. O código geralmente mudará com muito mais frequência do que o conteúdo do seu arquivo de bloqueio npm. As reconstruções de imagem que envolvem apenas alterações de código ignorarão efetivamente o RUN npm ci
degree (e todos os estágios anteriores), acelerando drasticamente o processo quando você tem muitas dependências.
Configurando o comando da imagem
O estágio ultimate do Dockerfile u.s.a. o CMD
instrução para executar seu aplicativo automaticamente quando o contêiner for iniciado. Isso funciona porque a imagem base do Node.js está configurada para usar o node
processo como seu ponto de entrada. O CMD
é anexado ao ponto de entrada herdado, resultando em node app.js
sendo executado como o processo de primeiro plano para sua nova imagem.
Construindo sua imagem
Em seguida, você precisa criar sua imagem:
docker construct -t node-app:newest .
O Docker levará o Dockerfile
em seu diretório de trabalho, execute as instruções dentro dele, e marque a imagem resultante Como node-app:newest
. O ultimate .
(ponto) especifica seu diretório de trabalho como o contexto de criação de imagem. Isso determina os caminhos que podem ser referenciados pelo COPY
instruções em seu Dockerfile.
Otimização de compilação
Uma maneira de melhorar o desempenho da compilação é adicionar um .dockerignore
arquivo para a raiz do seu projeto. Dê ao arquivo o seguinte conteúdo:
node_modules/
Este arquivo outline caminhos em seu diretório de trabalho que não ser incluído no contexto de construção. Você não poderá referenciá-los dentro do seu Dockerfile. No caso de node_modules
o conteúdo deste diretório é irrelevante para a compilação, pois estamos instalando as dependências novamente por meio do RUN npm ci
instrução. Excluindo especificamente o node_modules
já presente em seu diretório de trabalho evita a necessidade de copiar todos esses arquivos para o native de contexto de compilação temporário do Docker. Isso aumenta a eficiência e reduz o pace gasto na preparação da construção.
Iniciando um contêiner
Neste ponto, você está pronto para executar seu aplicativo usando o Docker:
docker run -d -p 8080:8080 --name my-app --restart on-failure node-app:newest
O docker run
O comando é usado para iniciar uma nova instância de contêiner a partir de uma imagem especificada. Alguns sinalizadores extras são adicionados para configurar corretamente o contêiner para o caso de uso pretendido:
-d
– Desanexa seu shell do processo de primeiro plano do contêiner, executando-o efetivamente como um servidor de segundo plano.-p
– Vincula a porta 8080 em seu host à porta 8080 dentro do contêiner (na qual nosso aplicativo de amostra Specific foi configurado para escutar). Isso significa tráfego paralocalhost:8080
será repassado para o porto de contêiner correspondente. Você pode alterar a postagem do host para um valor diferente modificando a primeira parte da definição de ligação, como8100:8080
para acessar seu contêiner emlocalhost:8100
.--name
– Atribui ao contêiner um nome amigável que você pode usar para referenciá-lo em outros comandos da CLI do Docker.--restart
– Seleciona o política de reinício para aplicar no recipiente. Oon-failure
A configuração significa que o Docker reiniciará automaticamente o contêiner se ele sair com um código de falha porque seu aplicativo travou.
A imagem construída na etapa anterior é referenciada como o argumento ultimate para o docker run
comando. O ID do contêiner será emitido para a janela do seu terminal; você poderá acessar seu aplicativo Node.js visitando localhost:8080
novamente. Desta vez, o servidor está sendo executado dentro do contêiner do Docker, em vez de usar o node
processo instalado em seu host.
Resumo
O Docker ajuda você a implantar serviços da Internet Node.js por meio da conteinerização de todo o ambiente do aplicativo. Você pode iniciar um contêiner a partir de sua imagem com um único docker run
comando em qualquer host com o Docker instalado. Isso elimina a complexidade de manter versões do Node.js, instalar módulos npm e monitorar situações em que o processo do aplicativo precisa ser reiniciado.
Quando você fizer alterações no código e quiser iniciar sua atualização, reconstrua sua imagem do Docker e remova seu contêiner antigo com docker rm <container-name>
. Você pode então iniciar uma instância de substituição que u.s.a. a imagem revisada.
Você pode querer uma rotina um pouco diferente na produção. Embora você possa usar uma instalação standard do Docker com docker run
, isso tende a ser difícil para todos, exceto os aplicativos mais simples. É mais comum usar uma ferramenta como Composição do Docker ou Kubernetes para definir a configuração do contêiner em um arquivo que pode ser versionado dentro do seu repositório.
Esses mecanismos eliminam a necessidade de repetir sua docker run
sinalizadores cada vez que você inicia um novo contêiner. Eles também facilitam a replicação de contêineres para dimensionar seu serviço e fornecer redundância. Se você estiver implantando em um host remoto, também precisará empurre sua imagem para um registro do Docker para que possa ser “puxado” de sua máquina de produção.
Outra consideração específica da produção é como você roteará o tráfego para seus contêineres. As vinculações de porta podem ser suficientes para começar, mas eventualmente você chegará a uma situação em que deseja vários contêineres em um host, cada um ouvindo na mesma porta. Neste caso você pode implantar um reverter procuração para rotear o tráfego para portas de contêiner individuais com base nas características da solicitação, como nome de domínio e cabeçalhos.
[ad_2]
Fonte da Notícia