La contenedorización permite estandarizar el entorno de ejecución de aplicaciones Node.js, garantizando que el software funcione de la misma manera en desarrollo, pruebas y producción. A continuación, se detalla el proceso para crear un servicio web básico y empaquetarlo en una imagen de Docker.
1. Preparación del entorno
Antes de comenzar, es necesario contar con Node.js y Docker instalados en el sistema. En entornos basados en Linux, se puede realizar la instalación mediante el gestor de paquetes:
apt update
apt install nodejs npm
Verifique la instalación consultando las versiones actuales:
node -v
npm -v
2. Inicialización del proyecto
Cree un directorio dedicado para la aplicación y genere el archivo de configuración de dependencias package.json.
mkdir api-container
cd api-container
npm init -y
npm install express
3. Creación del servidor web
Para este ejemplo, utilizaremos el framework Express para levantar un servidor sencillo. Cree un archivo llamado server.js con la siguiente lógica:
const express = require('express');
const app = express();
const PORT = 3000;
app.get('/', (req, res) => {
res.send('Servicio ejecutándose correctamente desde un contenedor Docker');
});
app.listen(PORT, () => {
console.log(`Servidor web activo en http://localhost:${PORT}`);
});
4. Configuración del Dockerfile
El Dockerfile es el manifiesto que define cómo se construye la imagen del contenedor. Cree este archivo en la raíz del proyecto:
# Seleccionar una imagen base ligera
FROM node:18-alpine
# Definir el directorio de trabajo interno
WORKDIR /usr/src/app
# Copiar manifiestos de dependencias
COPY package*.json ./
# Instalar dependencias de producción
RUN npm install --only=production
# Copiar el resto del código fuente
COPY . .
# Informar el puerto que utiliza la aplicación
EXPOSE 3000
# Comando para iniciar el servicio
CMD ["node", "server.js"]
Explicación de las instrucciones:
- FROM: Establece la imagen base (Node.js 18 sobre Alpine Linux para reducir el tamaño).
- WORKDIR: Define la ruta donde se ejecutarán los comandos posteriores dentro del contenedor.
- COPY package*.json: Copia solo los archivos de dependencias primero para aprovechar la caché de capas de Docker.
- RUN npm install: Descarga las librerías necesarias.
- EXPOSE: Documenta el puerto en el que el contenedor escuchará conexiones.
- CMD: Especifica el proceso principal que debe ejecutarse al iniciar el contenedor.
5. Construcción y despliegue del contenedor
Con el archivo de configuración listo, proceda a generar la imagen de Docker:
# Construir la imagen con una etiqueta personalizada
docker build -t mi-servicio-node .
Una vez finalizada la construcción, ejecute el contenedor vinculando el puerto del sistema local con el del contenedor:
# Ejecutar en modo desatendido (background)
docker run -p 8080:3000 -d mi-servicio-node
En este comando, el parámetro -p 8080:3000 mapea el tráfico del puerto 8080 de su máquina host al puerto 3000 del contenedor. Ahora puede acceder al servicio abriendo un navegador en http://localhost:8080.
6. Verificación de la estructura interna
Docker organiza los archivos según la directiva WORKDIR definida. Si accede al contenedor en ejecución, observará que la estructura de archivos en /usr/src/app contiene el código fuente y la carpeta node_modules generada durante la construcción de la imagen.