Docker & KubernetesDocker FundamentosLección 5 de 12
Docker en Produccion: builds y seguridad
En produccion necesitas imagenes pequenas, seguras y eficientes. Las tecnicas clave son:
• Multi-stage builds: Usar una imagen para compilar y otra (minima) para ejecutar • Health checks: Docker verifica automaticamente si tu app esta sana • Seguridad: No ejecutar como root, usar imagenes minimas, escanear vulnerabilidades • Distroless: Imagenes de Google sin shell ni herramientas — solo tu binario • Logging: Configurar salida de logs para sistemas de monitoreo
# Multi-stage build: imagen final de ~50MB en vez de ~1GB
# Etapa 1: Compilar
FROM node:20-alpine AS builder
WORKDIR /app
COPY package*.json ./
RUN npm ci
COPY . .
RUN npm run build
# Etapa 2: Ejecutar (solo lo necesario)
FROM node:20-alpine AS production
WORKDIR /app
COPY --from=builder /app/dist ./dist
COPY --from=builder /app/node_modules ./node_modules
COPY --from=builder /app/package.json ./
# No ejecutar como root
RUN addgroup -S appgroup && adduser -S appuser -G appgroup
USER appuser
EXPOSE 3000
HEALTHCHECK --interval=30s --timeout=3s --retries=3 \
CMD wget --spider -q http://localhost:3000/health || exit 1
CMD ["node", "dist/server.js"]
# Ejemplo con imagen distroless (Go)
FROM golang:1.22-alpine AS builder
WORKDIR /app
COPY . .
RUN CGO_ENABLED=0 go build -o server .
# Imagen distroless: sin shell, sin apt, sin nada extra
FROM gcr.io/distroless/static-debian12
COPY --from=builder /app/server /
EXPOSE 8080
CMD ["/server"]
# Resultado: imagen de ~10MB, superficie de ataque minima
# Buenas practicas de seguridad en Docker
# Escanear vulnerabilidades en una imagen
docker scout cves mi-app:latest
# Ver el historial de capas de una imagen
docker history mi-app:latest
# Limitar recursos del contenedor
docker run -d --memory=512m --cpus=1.0 mi-app:latest
# Ejecutar en modo read-only (filesystem inmutable)
docker run -d --read-only --tmpfs /tmp mi-app:latest
# Configurar logging
docker run -d --log-driver=json-file \
--log-opt max-size=10m \
--log-opt max-file=3 \
mi-app:latest
ConsejoSiempre usa USER para no ejecutar como root. Un atacante que comprometa tu app tendra permisos limitados si no es root dentro del contenedor.
Practica esta lección
Resuelve los ejercicios del curso de Docker & Kubernetes en la app, gratis y con corrección automática.
Empezar a practicar