saltar al contenido
volver al mapa
técnica
etapa: foundations
2 min de lectura

Contenedores e imágenes

Un contenedor empaqueta una aplicación con sus dependencias y la ejecuta aislada del host. Una buena imagen es pequeña, determinista y corre como usuario no root.

Docker / PodmanBuildKitTrivyHadolintDivecontainer registries

Cómo funcionan los contenedores

  • Un contenedor es un proceso Linux normal con su propia vista del sistema de archivos, la red y la tabla de procesos (namespaces) y con recursos limitados (cgroups). Comparte el kernel del host, a diferencia de una máquina virtual.
  • Una imagen es una pila de capas de solo lectura más metadatos. Un contenedor añade una capa delgada escribible encima.
  • Un registry almacena imágenes por nombre y tag; un digest (sha256) identifica el contenido exacto y nunca cambia.
  • Los contenedores están pensados para ser desechables: el estado vive en volúmenes, bases de datos u object storage, no dentro del contenedor.

Un Dockerfile débil

Problemas: un tag flotante cambia sin aviso, se copia todo el directorio (incluidos .git y .env), las dependencias de desarrollo y las herramientas de build llegan a producción, no hay caché de capas y el proceso corre como root.

Dockerfile (antes)dockerfile
FROM node:latest
COPY . .
RUN npm install
EXPOSE 3000
CMD ["node", "server.js"]

Uno mejor

Usa una base fijada, un build multi-stage, instalación desde el lockfile, un usuario no root y un archivo de ignore.

Dockerfile (después)dockerfile
# etapa de build: tiene los compiladores y las dependencias de desarrollo
FROM node:22-slim@sha256:<digest-you-reviewed> AS build
WORKDIR /app
COPY package.json package-lock.json ./
RUN npm ci
COPY . .
RUN npm run build && npm prune --omit=dev

# etapa de runtime: solo lo que la aplicación necesita
FROM node:22-slim@sha256:<digest-you-reviewed>
ENV NODE_ENV=production
WORKDIR /app
COPY --from=build --chown=node:node /app/dist ./dist
COPY --from=build --chown=node:node /app/node_modules ./node_modules
USER node
EXPOSE 3000
HEALTHCHECK CMD node -e "fetch('http://localhost:3000/health').then(r=>process.exit(r.ok?0:1)).catch(()=>process.exit(1))"
CMD ["node", "dist/server.js"]
.dockerignoretext
.git
node_modules
.env
*.log
coverage

Hábitos

  • Reconstruye y vuelve a desplegar con regularidad: las imágenes no se parchean solas.
  • Escanea las imágenes en CI y falla ante hallazgos graves que puedas corregir.
  • Un proceso por contenedor, logs a stdout, configuración mediante el entorno o archivos montados.
  • Etiqueta con el commit y despliega por digest para que el rollback sea exacto.
  • Mantén las imágenes pequeñas: menos paquetes, menos vulnerabilidades, pulls más rápidos.

conexiones en el mapa

actualizado el 14/10/2026 · fuentes para profundizar · reportar un error

en otros dominios

Estudia antes

Desbloquea

pon a prueba lo que entendiste

Cargando preguntas…