Node.js

Node

Tutorial Node: Dockerfile node

Aprende a crear un Dockerfile para Node.js y construir imágenes Docker optimizadas para desarrollo y producción.

Aprende Node y certifícate

Dockerfile para Node.js

Un Dockerfile es un archivo de texto que contiene una serie de instrucciones para construir una imagen de Docker de forma automatizada. Para aplicaciones Node.js, este archivo define el entorno de ejecución, las dependencias y la configuración necesaria para que nuestra aplicación funcione correctamente dentro de un contenedor.

Requisitos previos

Antes de crear nuestro Dockerfile, necesitamos tener Docker instalado en nuestro sistema. Docker está disponible para Windows, macOS y Linux:

  • Windows y macOS: Descarga Docker Desktop desde el sitio oficial de Docker
  • Linux (Ubuntu/Debian):
# Actualizar el sistema
sudo apt update

# Instalar Docker
sudo apt install docker.io

# Iniciar el servicio Docker
sudo systemctl start docker
sudo systemctl enable docker

# Añadir tu usuario al grupo docker (opcional, para evitar usar sudo)
sudo usermod -aG docker $USER

Para verificar que Docker está correctamente instalado, ejecuta:

docker --version

Estructura básica de un Dockerfile para Node.js

Vamos a crear un Dockerfile paso a paso para una aplicación Node.js. Primero, necesitamos una aplicación básica de ejemplo:

package.json:

{
  "name": "mi-app-node",
  "version": "1.0.0",
  "description": "Aplicación Node.js de ejemplo",
  "main": "server.js",
  "scripts": {
    "start": "node server.js"
  },
  "dependencies": {
    "http": "^0.0.1-security"
  }
}

server.js:

const http = require('http');

const server = http.createServer((req, res) => {
  res.writeHead(200, { 'Content-Type': 'text/plain' });
  res.end('¡Hola desde Node.js en Docker!\n');
});

const PORT = process.env.PORT || 3000;
server.listen(PORT, () => {
  console.log(`Servidor ejecutándose en puerto ${PORT}`);
});

Creación del Dockerfile

Ahora creamos nuestro Dockerfile en la raíz del proyecto:

# Usar la imagen oficial de Node.js versión 22 LTS
FROM node:22-alpine

# Establecer el directorio de trabajo dentro del contenedor
WORKDIR /app

# Copiar los archivos de dependencias
COPY package*.json ./

# Instalar las dependencias
RUN npm ci --only=production

# Copiar el resto del código de la aplicación
COPY . .

# Crear un usuario no privilegiado para ejecutar la aplicación
RUN addgroup -g 1001 -S nodejs
RUN adduser -S nodejs -u 1001

# Cambiar la propiedad de los archivos al usuario nodejs
RUN chown -R nodejs:nodejs /app
USER nodejs

# Exponer el puerto en el que la aplicación escucha
EXPOSE 3000

# Comando para ejecutar la aplicación
CMD ["npm", "start"]

Explicación de las instrucciones del Dockerfile

Cada línea del Dockerfile tiene un propósito específico:

  • FROM node:22-alpine: Utiliza la imagen base oficial de Node.js versión 22 con Alpine Linux, que es más ligera
  • WORKDIR /app: Establece el directorio de trabajo donde se ejecutarán los comandos posteriores
  • COPY package.json ./*: Copia los archivos de configuración de npm antes que el resto del código
  • RUN npm ci --only=production: Instala las dependencias de producción de forma optimizada
  • COPY . .: Copia todo el código fuente al contenedor
  • RUN addgroup/adduser: Crea un usuario no privilegiado por seguridad
  • USER nodejs: Cambia al usuario no privilegiado para ejecutar la aplicación
  • EXPOSE 3000: Documenta qué puerto utiliza la aplicación
  • CMD ["npm", "start"]: Define el comando por defecto para ejecutar la aplicación

Archivo .dockerignore

Es importante crear un archivo .dockerignore para excluir archivos innecesarios:

node_modules
npm-debug.log
.git
.gitignore
README.md
.env
coverage
.nyc_output

Construcción de la imagen Docker

Para construir la imagen desde nuestro Dockerfile, ejecutamos:

# Construir la imagen con un nombre y etiqueta
docker build -t mi-app-node:1.0.0 .

# Verificar que la imagen se creó correctamente
docker images

Para ejecutar el contenedor localmente y probar la aplicación:

# Ejecutar el contenedor mapeando el puerto 3000
docker run -p 3000:3000 mi-app-node:1.0.0

# Ejecutar en segundo plano (detached)
docker run -d -p 3000:3000 --name mi-contenedor mi-app-node:1.0.0

Subida a Docker Hub

Para compartir nuestra imagen en Docker Hub, seguimos estos pasos:

1. Crear cuenta en Docker Hub:

Regístrate en hub.docker.com si no tienes cuenta.

2. Iniciar sesión desde la terminal:

docker login

3. Etiquetar la imagen con tu nombre de usuario de Docker Hub:

# Formato: docker tag imagen-local usuario/repositorio:etiqueta
docker tag mi-app-node:1.0.0 tuusuario/mi-app-node:1.0.0
docker tag mi-app-node:1.0.0 tuusuario/mi-app-node:latest

4. Subir la imagen al registro:

# Subir versión específica
docker push tuusuario/mi-app-node:1.0.0

# Subir versión latest
docker push tuusuario/mi-app-node:latest

Optimizaciones para producción

Para aplicaciones de producción, considera estas mejoras en tu Dockerfile:

FROM node:22-alpine AS builder

WORKDIR /app
COPY package*.json ./
RUN npm ci --only=production && npm cache clean --force

FROM node:22-alpine AS production

WORKDIR /app
RUN addgroup -g 1001 -S nodejs && \
    adduser -S nodejs -u 1001

COPY --from=builder /app/node_modules ./node_modules
COPY --chown=nodejs:nodejs . .

USER nodejs
EXPOSE 3000

HEALTHCHECK --interval=30s --timeout=3s --start-period=5s --retries=3 \
  CMD node healthcheck.js

CMD ["node", "server.js"]

Esta versión optimizada utiliza construcción multi-etapa para reducir el tamaño final de la imagen y añade un healthcheck para monitorear el estado del contenedor en producción.

Aprende Node online

Otras lecciones de Node

Accede a todas las lecciones de Node y aprende con ejemplos prácticos de código y ejercicios de programación con IDE web sin instalar nada.

Accede GRATIS a Node y certifícate

Ejercicios de programación de Node

Evalúa tus conocimientos de esta lección Dockerfile node con nuestros retos de programación de tipo Test, Puzzle, Código y Proyecto con VSCode, guiados por IA.