Skip to main content

Documentation Index

Fetch the complete documentation index at: https://mintlify.com/midudev/jscamp/llms.txt

Use this file to discover all available pages before exploring further.

Esta es una referencia rápida de todos los comandos Docker y las instrucciones Dockerfile cubiertas en el módulo 10 de JSCamp. Incluye los ejemplos reales del repositorio: el multi-stage build para la app de producción, la configuración de Docker Compose y el uso del cache de BuildKit para acelerar las builds.
Crea siempre un archivo .dockerignore en la raíz de tu proyecto para excluir node_modules, archivos .env, el directorio .git y otros archivos innecesarios. Esto reduce el tamaño del contexto de build y evita incluir secretos en la imagen.
node_modules
.git
.env
dist
*.log

Comandos Docker Esenciales

Imágenes

ComandoDescripción
docker build -t <nombre> .Construye una imagen a partir del Dockerfile en el directorio actual y la etiqueta con <nombre>.
docker build -t <nombre>:<tag> .Construye la imagen con una etiqueta de versión específica (p. ej. myapp:1.0).
docker imagesLista todas las imágenes almacenadas localmente.
docker rmi <imagen>Elimina una imagen local por nombre o ID.
docker pull <imagen>Descarga una imagen desde Docker Hub (o un registry configurado).
docker tag <origen> <destino>Crea un alias (tag) para una imagen existente.

Contenedores

ComandoDescripción
docker run -p <host>:<contenedor> <imagen>Ejecuta un contenedor mapeando el puerto <host> al puerto <contenedor>.
docker run -d <imagen>Ejecuta el contenedor en segundo plano (detached mode).
docker run --rm <imagen>Ejecuta el contenedor y lo elimina automáticamente al terminar.
docker run --env-file .env <imagen>Pasa variables de entorno desde un archivo .env.
docker psLista los contenedores en ejecución actualmente.
docker ps -aLista todos los contenedores (incluidos los detenidos).
docker stop <id>Detiene un contenedor en ejecución de forma controlada (SIGTERM).
docker kill <id>Fuerza la detención inmediata de un contenedor (SIGKILL).
docker rm <id>Elimina un contenedor detenido.
docker rm -f <id>Fuerza la eliminación aunque el contenedor esté en ejecución.
docker logs <id>Muestra los logs de salida estándar del contenedor.
docker logs -f <id>Sigue los logs en tiempo real (follow).
docker exec -it <id> shAbre una shell interactiva dentro del contenedor en ejecución.
docker inspect <id>Muestra metadata completa del contenedor en JSON.

Docker Compose

ComandoDescripción
docker compose upLevanta todos los servicios definidos en compose.yaml.
docker compose up -dLevanta los servicios en segundo plano.
docker compose up --buildReconstruye las imágenes antes de levantar los servicios.
docker compose downDetiene y elimina los contenedores y redes creados.
docker compose down -vElimina también los volúmenes.
docker compose logs -fSigue los logs de todos los servicios.
docker compose psLista el estado de los servicios definidos en Compose.
docker compose exec <servicio> shAbre una shell en el contenedor del servicio indicado.

Docker Model Runner (módulo IA)

ComandoDescripción
docker model pull <modelo>Descarga un modelo de IA desde Docker Hub (p. ej. ai/smollm2).
docker model run <modelo>Ejecuta un modelo de IA de forma interactiva en la CLI.
docker model lsLista los modelos descargados localmente.
docker model rm <modelo>Elimina un modelo descargado.
docker model es una subcomando nativo de Docker Desktop (desde la versión 2026 en adelante) que permite descargar y ejecutar modelos de lenguaje optimizados para la GPU local (Metal/CUDA) sin necesidad de herramientas externas como Ollama.

Instrucciones Dockerfile

InstrucciónDescripción
FROM <imagen>Define la imagen base. Toda imagen empieza con FROM. En multi-stage se puede añadir AS <nombre>.
WORKDIR <ruta>Establece el directorio de trabajo. Crea la carpeta si no existe.
COPY <origen> <destino>Copia archivos desde el contexto de build hacia la imagen.
ADD <origen> <destino>Como COPY pero además descomprime archivos .tar y acepta URLs remotas.
RUN <comando>Ejecuta un comando en tiempo de build y crea una nueva capa.
CMD <comando>Comando por defecto al ejecutar el contenedor. Solo el último CMD tiene efecto.
ENTRYPOINT <comando>Punto de entrada del contenedor. Se combina con CMD para pasar argumentos.
ENV <clave>=<valor>Define variables de entorno disponibles en build-time y run-time.
ARG <nombre>[=<valor>]Define un argumento solo disponible en tiempo de build (no en run-time).
EXPOSE <puerto>Documenta el puerto en el que escucha el contenedor. No lo publica automáticamente.
USER <usuario>Cambia el usuario con el que se ejecutan los siguientes comandos (seguridad).
VOLUME <ruta>Declara un punto de montaje para datos persistentes.
LABEL <clave>=<valor>Añade metadatos a la imagen (autor, versión, etc.).
HEALTHCHECK <comando>Define un comando para comprobar que el contenedor está sano.
.dockerignoreArchivo (no instrucción) que excluye archivos del contexto de build.

Ejemplo: Multi-Stage Build

El archivo 10-docker/03-multi-stage/Dockerfile separa la build en dos etapas: builder (compilación) y runner (ejecución). La imagen final solo contiene el artefacto compilado, no las devDependencies ni el código fuente TypeScript.
# ─────────────────────────────────────────────────────
# ETAPA 1: Builder — compila el código TypeScript
# ─────────────────────────────────────────────────────
FROM node:22-alpine AS builder       # imagen base ligera; "AS builder" nombra la etapa

WORKDIR /app                         # todos los comandos siguientes operan en /app

COPY package*.json .                 # copia package.json y package-lock.json

RUN npm ci                           # instala TODAS las dependencias (incluyendo devDeps)

COPY . .                             # copia el código fuente

RUN npm run build                    # compila TypeScript → dist/

# ─────────────────────────────────────────────────────
# ETAPA 2: Runner — imagen de producción mínima
# ─────────────────────────────────────────────────────
FROM node:22-alpine AS runner        # nueva imagen limpia; no hereda nada de "builder"

WORKDIR /app

ENV NODE_ENV=production              # activa optimizaciones de producción en Node.js

# Copia SOLO el resultado compilado desde la etapa builder.
# Las devDependencies, el código fuente TS y el resto NO se incluyen.
COPY --from=builder /app/dist ./dist

EXPOSE 3000                          # documenta que la app escucha en el puerto 3000

USER node                            # ejecuta como usuario no-root por seguridad

CMD ["node", "dist/server.js"]       # comando de inicio de la aplicación
Ventajas del multi-stage build:

Imagen más pequeña

La imagen final no incluye TypeScript, ts-node, herramientas de test ni devDependencies. Puede pasar de ~500 MB a menos de 100 MB.

Mayor seguridad

El código fuente TypeScript y las credenciales de build nunca llegan a la imagen de producción.

Separación de concerns

La etapa builder puede tener cualquier herramienta necesaria para compilar sin contaminar la imagen final.

Cache eficiente

Docker cachea cada etapa de forma independiente. Si no cambias el package.json, la instalación de dependencias se reutiliza del cache.

Ejemplo: Docker Compose

El archivo 10-docker/02b-node-web/compose.yaml define un servicio Node.js listo para producción:
services:
  server:                    # nombre del servicio (usado como hostname en la red interna)
    build:
      context: .             # directorio de contexto: busca Dockerfile en la raíz
    environment:
      NODE_ENV: production   # variable de entorno inyectada en el contenedor
    ports:
      - 3000:3000            # mapeo <puerto-host>:<puerto-contenedor>
Explicación de cada campo:
Bloque raíz que contiene la definición de todos los servicios. Cada clave es el nombre del servicio y actúa también como hostname resolvible dentro de la red Docker interna.
Directorio que se envía al daemon de Docker como contexto de build. Docker buscará el Dockerfile dentro de este directorio. Puede ser una ruta relativa o absoluta.
Variables de entorno disponibles dentro del contenedor en tiempo de ejecución. Equivale a docker run -e NODE_ENV=production. También se puede referenciar un archivo con env_file: .env.
Mapeo de puertos en formato <host>:<contenedor>. El tráfico que llega al puerto 3000 del host se redirige al puerto 3000 dentro del contenedor.
Ejemplo extendido con base de datos (PostgreSQL):
services:
  server:
    build:
      context: .
    environment:
      NODE_ENV: production
      DATABASE_URL: postgres://postgres:secret@db:5432/devjobs
    ports:
      - 3000:3000
    depends_on:
      db:
        condition: service_healthy   # espera a que la BD esté lista

  db:
    image: postgres:16-alpine
    restart: always
    environment:
      POSTGRES_DB: devjobs
      POSTGRES_PASSWORD: secret
    volumes:
      - db-data:/var/lib/postgresql/data   # datos persistentes
    expose:
      - 5432
    healthcheck:
      test: ["CMD", "pg_isready"]
      interval: 10s
      timeout: 5s
      retries: 5

volumes:
  db-data:    # volumen nombrado — persiste entre reinicios

BuildKit: Cache Mount y Bind Mount

El Dockerfile de 10-docker/02b-node-web/ usa la sintaxis avanzada de BuildKit para optimizar la instalación de dependencias:
# syntax=docker/dockerfile:1    ← activa BuildKit y sus características avanzadas

ARG NODE_VERSION=26

FROM node:${NODE_VERSION}-alpine

ENV NODE_ENV production

WORKDIR /usr/src/app

# ── Instalación de dependencias con cache ─────────────────────────────────────
RUN --mount=type=bind,source=package.json,target=package.json \
    --mount=type=bind,source=package-lock.json,target=package-lock.json \
    --mount=type=cache,target=/root/.npm \
    npm ci --omit=dev

# ── Usuario no-root ───────────────────────────────────────────────────────────
USER node

# ── Código fuente ─────────────────────────────────────────────────────────────
COPY . .

EXPOSE 3000

CMD npm start

--mount=type=bind

Monta un archivo del contexto de build directamente en el sistema de archivos de la capa RUN sin copiarlo a la imagen. Se usa para que npm ci pueda leer package.json y package-lock.json sin necesidad de un COPY previo. La ventaja es que esos archivos no generan una capa adicional en la imagen.
--mount=type=bind,source=package.json,target=package.json
OpciónDescripción
sourceRuta en el contexto de build (tu máquina local).
targetRuta dentro del contenedor donde se monta.
readonly(opcional) Impide escrituras en el archivo montado.

--mount=type=cache

Monta un directorio de caché persistente entre builds. El directorio no se incluye en la imagen final, pero Docker lo conserva entre ejecuciones para reutilizarlo.
--mount=type=cache,target=/root/.npm
OpciónDescripción
targetDirectorio a cachear (aquí, la caché de npm en /root/.npm).
id(opcional) Identificador del caché; permite compartirlo entre stages.
sharing(opcional) shared (por defecto), private o locked.
Resultado: si package.json no cambia entre builds, npm ci reutiliza el caché de módulos y la descarga es casi instantánea. Esto puede reducir el tiempo de build de minutos a segundos.
--mount=type=cache requiere BuildKit. Asegúrate de que la primera línea de tu Dockerfile sea # syntax=docker/dockerfile:1 o configura DOCKER_BUILDKIT=1 como variable de entorno antes de ejecutar docker build.

Build docs developers (and LLMs) love