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.

Este módulo enseña Docker a través de 8 ejemplos prácticos y progresivos: desde un contenedor “hello world” hasta builds multietapa con esbuild, volúmenes persistentes, Docker Compose con bases de datos y la ejecución de modelos de IA locales con Docker Model Runner. Cada ejemplo está diseñado para añadir un concepto nuevo sobre el anterior.

Lo que aprenderás

  • Sintaxis de Dockerfile: FROM, WORKDIR, COPY, RUN, EXPOSE, USER, CMD
  • Selección de imágenes base (Alpine, slim, distroless)
  • Cómo funcionan las capas de imagen y por qué el orden importa para el caché
  • Uso de .dockerignore para excluir ficheros innecesarios
  • Optimización de builds con BuildKit cache (--mount=type=cache)
  • Multi-stage builds: compilar en una etapa y ejecutar en otra más pequeña
  • Volúmenes para persistir datos entre reinicios del contenedor
  • Orquestar servicios con Docker Compose
  • Ejecutar modelos de lenguaje localmente con Docker Model Runner

Los 8 Ejemplos

00-por-que

Por qué usar Docker — Demuestra el problema clásico de “funciona en mi máquina” con una app Node.js que depende de la versión del entorno.

01-hola-docker

Primer contenedor — Imagen Alpine mínima con un simple CMD ["echo", "Hola Docker"]. Introduce los conceptos de imagen y contenedor.

02-node-web

App Node.js básica — Servidor Express en contenedor con node:26-alpine. Cubre COPY, RUN npm install, EXPOSE y USER node.

02b-node-web

BuildKit y cache — Usa --mount=type=bind y --mount=type=cache para acelerar builds. Instala solo dependencias de producción con npm ci --omit=dev.

03-multi-stage

Build multietapa — Compila el código con esbuild en la etapa builder y copia solo el dist/ a la imagen final runner, sin devDependencies.

04-volumes

Volúmenes — Contador de visitas persistido en un archivo del sistema de ficheros. Demuestra la diferencia entre datos efímeros y volúmenes montados.

05-ia

IA Local — Microservicio Flask que se conecta a Docker Model Runner para responder preguntas usando el modelo ai/smollm2 (~256 MB), sin APIs externas.

06-compose

Docker Compose — App Node.js + base de datos PostgreSQL definidas como servicios. Introduce depends_on, secrets y volúmenes nombrados.
El ejemplo 07-vercel incluye un Dockerfile.vercel para desplegar una app Go en Vercel Fluid Compute, que detecta automáticamente el Dockerfile en la raíz del proyecto.

Ejemplo: Multi-Stage Build

El multi-stage build es una de las técnicas más importantes para producir imágenes pequeñas y seguras. La etapa builder compila el código; la etapa runner solo contiene lo necesario para ejecutarlo.
# etapa 1: Builder (fase de compilación)
FROM node:22-alpine AS builder

WORKDIR /app

COPY package*.json .

RUN npm ci

COPY . .

RUN npm run build

# etapa 2: Runtime (fase de ejecución)
FROM node:22-alpine AS runner

WORKDIR /app

ENV NODE_ENV=production

COPY --from=builder /app/dist ./dist

EXPOSE 3000

USER node

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

¿Por qué usar multi-stage?

Imagen simpleMulti-stage
Contiene devDeps✅ Sí❌ No
Contiene código fuente✅ Sí❌ No
TamañoGrandePequeño
Superficie de ataqueMayorMenor
La directiva COPY --from=builder copia artefactos de una etapa anterior sin necesidad de instalar herramientas de build en la imagen final.

Ejemplo: BuildKit y Cache (02b-node-web)

# syntax=docker/dockerfile:1

ARG NODE_VERSION=26

FROM node:${NODE_VERSION}-alpine

ENV NODE_ENV production

WORKDIR /usr/src/app

# Bind mounts + cache mount para npm: no copia package.json a la imagen,
# solo lo usa para instalar. El caché de /root/.npm persiste entre builds.
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

USER node

COPY . .

EXPOSE 3000

CMD npm start
02b-node-web/compose.yaml
services:
  server:
    build:
      context: .
    environment:
      NODE_ENV: production
    ports:
      - 3000:3000
El --mount=type=cache,target=/root/.npm le dice a BuildKit que mantenga el caché de npm entre builds, de modo que npm ci no descarga los paquetes desde internet en cada reconstrucción.

IA Local con Docker Model Runner

El ejemplo 05-ia/ levanta un microservicio Flask (Python) que reenvía las peticiones a la API local de Docker Model Runner, conectando con el modelo ai/smollm2 que corre directamente en tu hardware (Metal/CUDA).
FROM python:3.12-slim

WORKDIR /app

COPY requirements.txt .
RUN pip install --no-cache-dir -r requirements.txt

COPY app.py .

EXPOSE 5000

CMD ["python", "app.py"]
1

Descargar el modelo en el host

docker model pull ai/smollm2
Descarga el modelo (~256 MB) de Docker Hub directamente a tu máquina. Solo necesitas hacerlo una vez.
2

Verificar que el modelo está disponible

docker model run ai/smollm2
3

Levantar el contenedor Flask

cd 10-docker/05-ia
docker compose up -d --build
El contenedor expone el puerto 5002 del host mapeado al 5000 interno. Internamente se conecta a http://model-runner.docker.internal/v1/.
4

Hacer una consulta

curl "http://localhost:5002/ask?q=What+is+a+container+in+one+sentence"
Recibirás una respuesta JSON con la respuesta del modelo procesada de forma completamente offline.
5

Detener el contenedor

docker compose down
Docker Model Runner requiere Docker Desktop versión 2026 o posterior. Es necesario tenerlo instalado y en ejecución para que el DNS interno model-runner.docker.internal resuelva correctamente desde dentro del contenedor.

Comandos Docker Esenciales

# Construir una imagen desde el Dockerfile del directorio actual
docker build -t nombre-imagen .

# Construir con un Dockerfile específico
docker build -f Dockerfile.vercel -t web-vercel .

# Ejecutar un contenedor mapeando puertos
docker run -p 3000:3000 nombre-imagen

# Ejecutar en segundo plano (detached)
docker run -d -p 3000:3000 nombre-imagen

# Ver contenedores en ejecución
docker ps

# Ver logs de un contenedor
docker logs <container-id>

# Detener un contenedor
docker stop <container-id>

Resumen de Dockerfiles del Módulo

EjemploBase imageTécnica principal
00-por-quenode:22-alpineProblema del entorno
01-hola-dockeralpineCMD echo básico
02-node-webnode:26-alpineApp Express básica
02b-node-webnode:26-alpineBuildKit cache mounts
03-multi-stagenode:22-alpine (x2)Builder + Runner
04-volumesnode:22-alpinePersistencia en fichero
05-iapython:3.12-slimDocker Model Runner
06-composenode:22-alpineCompose + PostgreSQL
07-vercelgolang:1.24-alpine (x2)Multi-stage + Vercel Fluid

Build docs developers (and LLMs) love