GNU/Linux >> Tutoriales Linux >  >> Panels >> Docker

Cómo dockerizar una aplicación web Node.js

Docker es una plataforma de contenedorización que simplifica el empaquetado y la ejecución de aplicaciones. Los contenedores se ejecutan como procesos aislados con su propio sistema de archivos, pero comparten el kernel de su host. Docker se ha destacado como una forma de implementar entornos de desarrollo reproducibles y arquitecturas de implementación distribuida.

Node.js es el tiempo de ejecución de JavaScript líder para el desarrollo de back-end. El lanzamiento exitoso de un servicio web de Node.js requiere que tenga un entorno con el tiempo de ejecución instalado, el código de su aplicación disponible y un mecanismo que maneje los reinicios automáticos en caso de fallas.

En esta guía, usaremos Docker para contener una aplicación Node.js simple creada con el popular marco web Express. Docker es una buena forma de implementar sistemas basados ​​en nodos, ya que genera un entorno consistente que incluye todo lo que necesita para ejecutar su servicio. El demonio Docker tiene soporte integrado para reiniciar contenedores fallidos cuando su proceso en primer plano falla, resolviendo uno de los desafíos de las implementaciones de Node.js.

Creando tu proyecto de nodo

Omitiremos los detalles de la implementación de su aplicación. Cree un directorio para su proyecto y agregue un código de servidor dentro de él. Aquí hay un app.js básico que escucha en el puerto 8080 y responde a cada solicitud con una respuesta codificada:

const express = require("express");
 
const app = express();
app.get("*", (req, res) => res.send("<p>It works!</p>"));
app.listen(8080, () => console.log("Listening on 8080"));

Agregue Express a su proyecto usando npm:

npm init
npm install --save express

Inicie su aplicación para probar que funciona:

node app.js

Debería poder visitar localhost:8080 en su navegador para ver la respuesta de muestra.

Escribiendo un Dockerfile

Ahora es el momento de comenzar a dockerizar su proyecto. Primero necesita una imagen para su aplicación. Las imágenes encapsulan su código y dependencias como un paquete único que usa para iniciar instancias de contenedor. Las instrucciones en su Dockerfile definen el estado del sistema de archivos inicial de sus contenedores.

Aquí hay un Dockerfile que funciona para la aplicación de muestra:

FROM node:16
WORKDIR /app

COPY package.json .
COPY package-lock.json .
RUN npm ci

COPY app.js .
CMD ["app.js"]

Este Dockerfile selecciona la imagen Docker oficial de Node.js como su base a través de FROM declaración. La imagen hereda todo en la base, luego agrega contenido adicional a través de las siguientes instrucciones.

El directorio de trabajo se establece en /app por el WORKDIR línea. El siguiente COPY las declaraciones depositarán archivos en la /app directorio dentro de la imagen del contenedor.

Instalación de dependencias

La siguiente etapa es agregar package.json de npm y ejecuta npm ci . Esto instalará las dependencias npm de su proyecto, Express en este caso, dentro del sistema de archivos del contenedor.

No use COPY node_modules/ . para copiar los node_modules existentes carpeta en el directorio de su proyecto; esto le impediría reutilizar el Dockerfile en otros entornos de compilación. Dockerfiles debería permitirle crear compilaciones consistentes solo con el contenido de su repositorio de control de código fuente. Si un archivo o carpeta está en tu .gitignore , no se debe hacer referencia en un Dockerfile COPY instrucción.

Copiar código de aplicación

Después de npm ci se ha ejecutado, el código de su aplicación se copia en la imagen. La ubicación de este COPY instrucción después de RUN , separándolo de las copias anteriores, es deliberado. Cada instrucción crea una nueva capa en su imagen; El proceso de compilación de Docker almacena en caché cada capa para acelerar las compilaciones posteriores. Una vez que cambia el contenido de una capa, se invalidará la memoria caché de todas las capas siguientes.

Esta es la razón por la cual el código de la aplicación debe copiarse después de npm ci ha sido ejecutado. El código generalmente cambiará con mucha más frecuencia que el contenido de su archivo de bloqueo npm. Las reconstrucciones de imágenes que solo involucran cambios de código omitirán efectivamente el RUN npm ci etapa (y todas las etapas anteriores), acelerando drásticamente el proceso cuando tiene muchas dependencias.

Configuración del comando de la imagen

La etapa final de Dockerfile usa el CMD instrucción para ejecutar su aplicación automáticamente cuando se inicia el contenedor. Esto funciona porque la imagen base de Node.js está configurada para usar el node proceso como su punto de entrada. El CMD se agrega al punto de entrada heredado, lo que da como resultado node app.js se está ejecutando como el proceso de primer plano para su nueva imagen.

Construyendo tu imagen

A continuación, debe crear su imagen:

docker build -t node-app:latest .

Docker tomará el Dockerfile en su directorio de trabajo, ejecute las instrucciones que contiene y etiquete la imagen resultante como node-app:latest . El . final (punto) especifica su directorio de trabajo como el contexto de construcción de la imagen. Esto determina las rutas a las que puede hacer referencia COPY instrucciones en su Dockerfile.

Optimización de compilación

Una forma de mejorar el rendimiento de la compilación es agregar un .dockerignore archivo a la raíz de su proyecto. Dale al archivo el siguiente contenido:

node_modules/

Este archivo define rutas en su directorio de trabajo que no incluirse en el contexto de compilación. No podrá hacer referencia a ellos dentro de su Dockerfile. En el caso de node_modules , el contenido de este directorio es irrelevante para la compilación ya que estamos instalando las dependencias de nuevo a través de RUN npm ci instrucción. Excluyendo específicamente los node_modules ya presente en su directorio de trabajo ahorra tener que copiar todos esos archivos en la ubicación de contexto de compilación temporal de Docker. Esto aumenta la eficiencia y reduce el tiempo dedicado a preparar la construcción.

Inicio de un Contenedor

En este punto, está listo para ejecutar su aplicación usando Docker:

docker run -d 
    -p 8080:8080 
    --name my-app 
    --restart on-failure 
    node-app:latest

La docker run El comando se usa para iniciar una nueva instancia de contenedor a partir de una imagen específica. Se agregan algunas banderas adicionales para configurar correctamente el contenedor para el caso de uso previsto:

  • -d – Separa su caparazón del proceso de primer plano del contenedor, ejecutándolo efectivamente como un servidor de fondo.
  • -p – Vincula el puerto 8080 en su host al puerto 8080 dentro del contenedor (que nuestra aplicación de muestra Express se configuró para escuchar). Esto significa tráfico a localhost:8080 se trasladará al puerto de contenedores correspondiente. Puede cambiar la publicación del host a un valor diferente modificando la primera parte de la definición de vinculación, como 8100:8080 para acceder a su contenedor en localhost:8100 .
  • --name – Asigna al contenedor un nombre descriptivo que puede usar para hacer referencia a él en otros comandos de la CLI de Docker.
  • --restart – Selecciona la política de reinicio para aplicar al contenedor. El on-failure la configuración significa que Docker reiniciará automáticamente el contenedor si sale con un código de falla porque su aplicación se bloqueó.

Se hace referencia a la imagen creada en el paso anterior como el argumento final de docker run dominio. La identificación del contenedor se emitirá a la ventana de su terminal; debería poder acceder a su aplicación Node.js visitando localhost:8080 otra vez. Esta vez, el servidor se ejecuta dentro del contenedor Docker, en lugar de usar el node proceso instalado en su host.

Resumen

Docker lo ayuda a implementar los servicios web de Node.js al contener todo el entorno de la aplicación. Puede iniciar un contenedor desde su imagen con una sola ejecución docker run comando en cualquier host con Docker instalado. Esto elimina la complejidad de mantener versiones de Node.js, instalar módulos npm y monitorear situaciones en las que es necesario reiniciar el proceso de su aplicación.

Cuando haya realizado cambios en el código y desee iniciar su actualización, reconstruya su imagen de Docker y elimine su contenedor antiguo con docker rm <container-name> . Luego puede iniciar una instancia de reemplazo que use la imagen revisada.

Es posible que desee una rutina ligeramente diferente en producción. Aunque puede usar una instalación normal de Docker con docker run , esto tiende a ser difícil de manejar para todas las aplicaciones excepto para las más simples. Es más común usar una herramienta como Docker Compose o Kubernetes para definir la configuración del contenedor en un archivo que se puede versionar dentro de su repositorio.

Estos mecanismos eliminan la necesidad de repetir su docker run banderas cada vez que inicia un nuevo contenedor. También facilitan la replicación de contenedores para escalar su servicio y proporcionar redundancia. Si está implementando en un host remoto, también deberá enviar su imagen a un registro de Docker para que pueda "extraerse" de su máquina de producción.

Otra consideración específica de producción es cómo enrutará el tráfico a sus contenedores. Los enlaces de puerto pueden ser suficientes para empezar, pero eventualmente llegará a una situación en la que desea múltiples contenedores en un host, cada uno escuchando en el mismo puerto. En este caso, puede implementar un proxy inverso para enrutar el tráfico a puertos de contenedores individuales en función de las características de la solicitud, como el nombre de dominio y los encabezados.


Docker
  1. Cómo instalar Node.js y NPM en CentOS

  2. Cómo instalar Node.js y npm en Debian 11

  3. ¿Cómo hacer que Jshint funcione?

  4. Cómo instalar una aplicación web

  5. Cómo instalar Node.js y npm en Ubuntu 20.04

Cómo instalar Node.js y NPM en Debian 11

¿Cómo instalar Node.js y Npm en Ubuntu?

Node.js cPanel:cómo implementar una aplicación

Cómo crear una aplicación web con Node.js en Jelastic Cloud

Cómo instalar Node.js y Npm en Ubuntu 22.04

Cómo configurar la aplicación Node.js en cPanel