Saltar al contenido principal

Dockerfiles Multi-Stage y Distroless

En el desarrollo de aplicaciones modernas, la optimización de las imágenes de Docker es crucial para mejorar el rendimiento, reducir los tiempos de despliegue y aumentar la seguridad. En este capítulo aprenderemos dos técnicas fundamentales: los Dockerfiles multi-stage y las imágenes distroless.

Estas técnicas nos permiten crear imágenes más pequeñas, seguras y eficientes, separando el entorno de construcción del entorno de ejecución y eliminando componentes innecesarios.

Dentro vídeo: https://youtu.be/EJEMPLO

Curso de Docker

¿Qué son los Dockerfiles Multi-Stage?

Los Dockerfiles multi-stage son una característica de Docker que permite utilizar múltiples instrucciones FROM en un mismo Dockerfile. Cada instruccción FROM inicia una nueva etapa de construcción, y puedes copiar selectivamente artefactos de una etapa a otra.

Es decir, podríamos utilizar una imagen con todos los herramientas necesarias para la construcción y otra imagen más ligera para la ejecución. Ya que no necesitamos incluir herramientas como compiladores, gestores de paquetes, etc... en la imagen final.

En el caso de java, podríamos utilizar una imagen con el JDK para la construcción y otra con el JRE para la ejecución. En go, rust o c, podríamos construir los binarios y utilizar una imagen base mínima para la ejecución. Todos los lenguajes pueden aprovechar esta técnica.

Aunque los lenguajes compilados son los que más mejoría obtienen ya que no necesitan nada una vez generado el binario, los lenguajes interpretados como python o lenguajes transpilados como typescript también pueden beneficiarse al reducir el tamaño de las imágenes al eliminar dependencias de desarrollo y herramientas innecesarias.

Tabla de ejemplo de las dependencias que nos quitamos en un Dockerfile por lenguaje de programación:

LenguajeDependencias en construcciónDependencias en ejecución
JavaJDKJRE
GoCompiladorX
RustCompilador, CargoX
CGcc, Herramientas de DevX
PythonPip, herramietas de DevPython
TypeScriptNode.js, herramientas de DevNode.js

Ventajas de los Multi-Stage Builds

El uso de Dockerfiles multi-stage ofrece varias ventajas:

  • Imágenes más pequeñas: Solo incluyen los archivos necesarios para ejecutar la aplicación. Esto a su vez repercute en las dos siguientes.
  • Mayor seguridad: Eliminan herramientas de desarrollo y dependencias no necesariask
  • Mejor rendimiento: Menos datos que transferir y almacenar, mejores tiempos en la puesta en marcha.

Ejemplo Básico de Multi-Stage

Veamos un ejemplo simple con una aplicación Go:

# Etapa de construcción
FROM golang:1.21 AS builder
WORKDIR /app
COPY go.mod go.sum ./
RUN go mod download
COPY . .
RUN CGO_ENABLED=0 GOOS=linux go build -o main .

# Etapa de ejecución
FROM alpine:latest
RUN apk --no-cache add ca-certificates
WORKDIR /root/
COPY --from=builder /app/main .
CMD ["./main"]

Resumen

Los Dockerfiles multi-stage y las imágenes distroless son técnicas esenciales para crear contenedores optimizados. Permiten:

  • Reducir significativamente el tamaño de las imágenes
  • Mejorar la seguridad eliminando componentes innecesarios
  • Acelerar los despliegues y reducir los costos de almacenamiento
  • Mantener un entorno de producción limpio y controlado

En el siguiente capítulo exploraremos técnicas avanzadas de optimización del caché de Docker para acelerar aún más nuestros builds.


Volver al índice