Crie um Dockerfile para aplicativos Node.js

Sarasa Gunawardhana em Level Up Your Code Seguir 14 de maio · 4 min ler

Este artigo mostrará a você como criar um Dockerfile para seu aplicativo Node para permitir que ele seja executado como um contêiner do Docker. Você deve instalar o Docker primeiro para poder executar os comandos do docker.

Para criar um contêiner do Docker, você precisa criar um Dockerfile no seu projeto. Usando esse arquivo, você pode criar um contêiner do Docker que pode ser executado em qualquer plataforma sem instalar nenhuma biblioteca na máquina real.

O Docker permite empacotar um aplicativo com seu ambiente e todas as suas dependências em uma “caixa” encapsulada, chamada de contêiner. Geralmente, um contêiner consiste em um aplicativo em execução em uma versão reduzida ao básico de um sistema operacional Linux. Uma imagem é o blueprint de um contêiner, um contêiner é uma instância em execução de uma imagem.

Criando um aplicativo simples do Node.js

Nota: Você pode usar um aplicativo pré-existente se tiver projetos de Nó no seu computador. Caso contrário, esse aplicativo simples fornecerá um aplicativo básico para implantar.

Primeiro, crie um novo diretório e crie um arquivo package.json dentro dele:

 { 
"name": "nodejs app",
"version": "1.0.0",
"description": "create a dockerfile on Nodejs project",
"author": "sarasa Gunawardhana",
"main": "server.js",
"scripts": {
"start": "node server.js"
},
"dependencies": {
"express": "^4.16.1"
}
}

Execute a npm install .

Em seguida, crie um arquivo server.js que defina um aplicativo da web usando a estrutura Express.js :

 'use strict'; const express = require('express'); // Constants 
const PORT = 3000;
const app = express();
app.get('/', (req, res) => {
res.send('Docker and Nodejs');
});
app.listen(PORT, HOST);
console.log(`Running on
${PORT}`);

Nas próximas etapas, você criará um Dockerfile.

Criando um Dockerfile

criar um arquivo como Dockerfile

 touch Dockerfile 
# OR
nano Dockerfile

A primeira coisa que precisamos fazer é definir de qual imagem queremos construir. Aqui vamos usar o mais recente Node, versão 11.

 FROM node:11 

Em seguida, criamos um diretório para manter o código do aplicativo dentro da imagem, esse será o diretório de trabalho do seu aplicativo:

 # Create app directory 
WORKDIR /usr/src/app

Essa imagem vem com o Node.js e o NPM já instalados, então a próxima coisa que precisamos fazer é instalar as dependências do aplicativo usando o binário npm . Observe que, se você estiver usando o npm versão 4 ou anterior, um arquivo package-lock.json não será gerado.

 # Install app dependencies 
# A wildcard is used to ensure both package.json AND package-lock.json are copied
# where available (npm@5+)
COPY package*.json ./
RUN npm install
# If you are building your code for production
# RUN npm ci --only=production

Observe que, em vez de copiar todo o diretório de trabalho, estamos apenas copiando o arquivo package.json . Isso nos permite aproveitar as camadas do Docker em cache. O bitJudo tem uma boa explicação disso aqui . Além disso, o comando npm ci , especificado nos comentários, ajuda a fornecer versões mais rápidas, confiáveis e reproduzíveis para ambientes de produção. Você pode ler mais sobre isso aqui .

Para agrupar o código-fonte do seu aplicativo na imagem do Docker, use a instrução COPY :

 # Bundle app source 
COPY . .

Seu aplicativo se liga à porta 8080 portanto, você usará a instrução EXPOSE para que ela seja mapeada pelo daemon do docker :

 EXPOSE 3000 

Por último, mas não menos importante, defina o comando para executar seu aplicativo usando o CMD que define seu tempo de execução. Aqui vamos usar o básico npm start que irá executar o node server.js para iniciar o seu servidor:

 CMD [ "npm", "start" ] 

Seu Dockerfile agora deve ficar assim:

 FROM node:8 
# Create app directory
WORKDIR /usr/src/app
# Install app dependencies
# A wildcard is used to ensure both package.json AND package-lock.json are copied
# where available (npm@5+)
COPY package*.json ./
RUN npm install
# If you are building your code for production
# RUN npm ci --only=production
# Bundle app source
COPY . .
EXPOSE 3000
CMD [ "npm", "start" ]

Construindo sua imagem

Vá para o diretório que possui seu Dockerfile e execute o seguinte comando para criar a imagem do Docker. O sinalizador -t permite marcar sua imagem para facilitar a localização posterior usando o comando docker images :

 $ docker build -t <your username>/node-web-app . 

Sua imagem agora será listada pelo Docker:

 $ docker images # Example 
REPOSITORY TAG ID CREATED
node 8 1934b0b038d1 5 days ago
<your username>/node-web-app latest d64d3505b0d2 1 minute ago

Executar a imagem

Executar sua imagem com -d executa o contêiner no modo desanexado, deixando o contêiner em execução em segundo plano. O sinalizador -p redireciona uma porta pública para uma porta privada dentro do contêiner. Execute a imagem que você criou anteriormente:

 $ docker run -p 49160:8080 -d <your username>/node-web-app 

Imprima a saída do seu aplicativo:

 # Get container ID 
$ docker ps
# Print app output
$ docker logs <container id>
# Example
Running on
http://localhost:8080

Se você precisar entrar no container, você pode usar o comando exec :

 # Enter the container 
$ docker exec -it <container id> /bin/bash

Teste

Para testar seu aplicativo, encontre a porta do seu aplicativo que o Docker mapeou:

 $ docker ps # Example 
ID IMAGE COMMAND ... PORTS
ecce33b30ebf <your username>/node-web-app:latest npm start ... 49160->8080

No exemplo acima, o Docker mapeou a porta 8080 dentro do contêiner para a porta 49160 em sua máquina.

Agora você pode chamar seu aplicativo usando curl (instale se necessário via: sudo apt-get install curl ):

 $ curl -i localhost:49160 HTTP/1.1 200 OK 
X-Powered-By: Express
Content-Type: text/html; charset=utf-8
Content-Length: 12
ETag: W/"c-M6tWOb/Y57lesdjQuHeB1P/qTV0"
Date: Mon, 13 Nov 2017 20:53:59 GMT
Connection: keep-alive
Docker on nodejs