La contenerización consiste en empaquetar una aplicación, sus dependencias y bibliotecas juntas para que puedan utilizarse como plug-and-play en cualquier tipo de infraestructura. Cada paquete se llama un contenedor.
¿Por qué contenerizar un servicio Node.js?
Como se discutió en la última sección, contenerizar unservicio Node.js significaría empaquetar la aplicación, sus dependencias, bibliotecas e incluso configuración en un contenedor único.La contenerización tiene los siguientes beneficios:
- Portable. Dado que hemos empaquetado todos los requisitos de la aplicación en un contenedor, las mismas imágenes se pueden instalar en desarrollo, pruebas y producción.
- Rápido y ligero. Los contenedores tienden a ser mucho más rápidos que las máquinas virtuales (VM) o el hardware físico, ya que solo ejecutan los requisitos de la aplicación, mientras que históricamente, las VM o el hardware físico arrancarían toda la máquina y todas las aplicaciones.
- Escala.Con los dos beneficios anteriores, la escalabilidad se vuelve muy fácil ya que los contenedores son rápidos, eficientes y fáciles de implementar.
En este artículo, nos enfocaremos específicamente encontenerizar una aplicación Node.js.
Prerrequisitos
Herramientas y Software
Docker (Docker Engine y Docker CLI)
Necesitaremos instalar Docker para gestionar nuestros contenedores. Docker Engine maneja el tiempo de ejecución, y CLI se puede utilizar para interactuar a través de la línea de comandos.
Node.js y npm/yarn instalados (Para Desarrollo/Pruebas Iniciales)
Necesitaremos Node.js y npm instalados para instalar las dependencias de las librerías y ejecutar el servicio.
Kubernetes o Docker Compose para Gestionar Múltiples Contenedores (Opcional)
Necesitaremos Kubernetes o Docker Compose para gestionar múltiples contenedores.
Fundamentos
Estructura de una aplicación Node.js:
- Se espera que el lector ya entienda el papel del archivo principal (
app.js
oindex.js
) en el proyecto, junto con el papel de otros archivos comopackage.json
yyarn.lock
. - Este artículo tampoco profundizará en otros aspectos del proyecto, como controladores, middleware y rutas.
Comandos Básicos de Docker y Sintaxis de Dockerfile
Comandos de Docker:
docker ps -> Lists all the containers running on the system
docker pull -> Pulls any image from the docker hub or official registry of Docker
docker build -> Creates an image from the docker file
docker run -> Starts a container from an exiting image
docker stop -> Stops a container if it has crashed or if you want to switch the container
Instrucciones Básicas del Dockerfile:
FROM -> Every DockerFile
WORKDIR -> Set the working directory inside the container
COPY (or ADD) -> Transfers the application's files to the image
RUN -> Executes commands during build time
CMD -> Sets the default command to be run when the container is started from the image
EXPOSE -> Specifies the port the container listens on
ENV -> Sets environment variables used during build and runtime
Ambas tablas cubiertas y la estructura de Node.js son suficientes para comenzar con la contenerización y despliegue de su servicio Node.js.
Configuración del Servicio Node.js
Configuración del entorno Node.js es un proceso sencillo. Asegúrese de tener Node.js instalado en su máquina. Si tiene alguna duda, consulte el apéndice (1). Una vez instalado, abra su terminal y verifique la instalación escribiendo.
node -v
npm -v
Cree un directorio de proyecto e inicialice su proyecto de la siguiente manera:
npm init -y
Instale el módulo express
npm install express
Cree un archivo de servidor, vamos a llamarlo server.mjs, donde podemos agregar la ruta y la lógica correspondiente a la ruta. Dado que este artículo se centra más en la contenerización, mantendremos la lógica del punto final muy sencilla. Algo así:
import express from "express";
const app = express();
const port = 8080;
app.get('/', (req, res) => {
res.send('Welcome to my demo service!');
});
app.listen(port, () => {
console.log(`Demo Service is running on port ${port}`);
});
Ahoratu servicio está listo para ser iniciado, navega hasta el directorio del proyecto en la terminal y ejecuta este comando:
node server.mjs
El servicio está arriba y funcionando; si visitamos http://localhost:3000, veremos:
“Bienvenido a mi servidor”
Creando el Dockerfile
Vamos a revisar qué es un Dockerfile, contiene las instrucciones para construir la imagen de docker. Creemos un Dockerfile en el directorio raíz. Durante este paso, como discutimos en las instrucciones de Dockerfile, necesitamos hacer lo siguiente:
FROM node:18-alpine => Indicate the base image to use. Here we're using the official Nodejs 14 image.
WORKDIR /usr/src/app => Sets the working directory in the container.
COPY package*.json ./ => Duplicate the package.json and package-lock.json files to the working directory.
RUN npm install => Installs the app package dependencies.
COPY . . => Copies the remaining of the app to the working directory.
EXPOSE 8080 => Exposes the port our app is listening on.
CMD ["node", "app.js"] => Defines the command to start your Node.js application.
Construyendo y Ejecutando la Imagen de Docker
Desde la raíz del terminal, navega hastatuproyecto y ejecuta el siguientecomando:
docker build -t image-name .
Donde nombre-de-la-imagen
es el nombre de la imagen Docker. El .
al final establece el contexto en el directorio actual.
Una vez que la imagen esté construida, crearemos el contenedor y ejecutaremos la aplicación Node.js con el siguientecomando:
docker run --name container-name -p 8080:8080 image-name
Una vez que lo anterior sea exitoso,túpuedes verificar que el servicio estáen ejecuciónal ejecutar docker ps
, y luego ir a la misma URL de localhost que antes.
Subir Imágenes a un Registro
Ahora quetu imagen está lista, es hora de subirla a un registro. Para el alcance de este artículo, vamos a subirla solo a Docker Hub. Docker Hub es un servicio basado en la nube para almacenar, compartir y gestionar imágenes de contenedores Docker.
Crea una cuenta en https://hub.docker.com/ e inicia sesión con tu cuenta.
docker login
Una vez iniciada la sesión, las imágenes construidas localmente pueden ser agregadas como:
docker tag image-name:tag dockerhub-username/repository-name:tag
Donde:
etiqueta
es o bienúltima
o un número de versión.nombre-del-repositorio
es el nombre de repositorio deseado.
A continuación, sube la imagen de la siguiente manera:
docker push dockerhub-username/repository-name:tag
Conclusión
Como podemos ver, la contenerización hace que los flujos de trabajo y servicios complejos sean rápidos, portátiles y escalables al separar las dependencias. Una vez implementado, todo el equipo se beneficia de ello.Te animo a que explores las funciones avanzadas como las construcciones de múltiples etapas y la red de contenedores. Además, considera aprender sobre herramientas de orquestación (por ejemplo, Kubernetes) e integrar tuberías CI/CD para optimizar tu flujo de trabajo de desarrollo.
Apéndice
Source:
https://dzone.com/articles/containerization-of-a-nodejs-service