Reducir capas en Docker es una de las prácticas más efectivas para optimizar imágenes y bajar su tamaño final. Si trabajas con contenedores y quieres imágenes más ligeras y rápidas en la nube, entender cómo se generan y combinan las capas dentro de un Dockerfile te va a ahorrar megas y segundos de build.
Lo interesante es que esta optimización no requiere que pienses demasiado en ella. Con la práctica, vas a reducir capas de forma natural, casi por intuición.
¿Qué es una capa en Docker y cómo se genera?
Cada instrucción que escribes en un Dockerfile genera una capa nueva dentro de la imagen. Eso significa que entre más comandos sueltos tengas, más pesada y lenta será tu imagen final.
Para verlo claro, imagina un Dockerfile sencillo con cinco instrucciones [00:50]:
- Capa 1: imagen base con
FROM ubuntu:latest.
- Capa 2: actualización con
apt update.
- Capa 3: instalación de curl, una herramienta para hacer solicitudes HTTP.
- Capa 4: copia de archivos al directorio
/app.
- Capa 5: ejecución de un comando tipo Hello world.
Cada uno de esos pasos suma peso. Y aquí viene lo interesante: muchos de ellos se pueden fusionar.
¿Qué es una capa en Docker? Es el resultado de cada instrucción dentro de un Dockerfile. Cada comando como FROM, RUN o COPY crea una capa nueva que se apila sobre la anterior para formar la imagen final.
¿Cómo reduzco el número de capas en mi Dockerfile?
La clave está en agrupar comandos relacionados dentro de una sola instrucción RUN. En lugar de separar apt-get update y apt-get install en líneas distintas, los unes con && y, de paso, eliminas archivos de configuración que ya no necesitas.
En el ejemplo de la clase, la primera versión de la imagen capas pesó 204 MB después de 26 segundos de build [02:30]. Al fusionar los comandos en una sola capa, la nueva imagen capas2 bajó a 131 MB y el tiempo se redujo en casi 11 segundos [03:25]. Eso es poco más de la mitad del peso original, partiendo de la misma imagen base.
Este proceso es lo que en programación se llama refactorización de código: reescribir lo que ya funciona para que sea más limpio y eficiente. Aplicado a Docker, refactorizar capas significa que múltiples pasos se condensen en menos instrucciones, ahorrando espacio sin cambiar la funcionalidad.
¿Qué comandos conviene fusionar dentro de un RUN?
Los candidatos naturales son los que pertenecen al mismo flujo lógico:
- Actualización del sistema con
apt-get update.
- Instalación de paquetes como curl o cualquier dependencia.
- Limpieza de archivos temporales y cachés que ya no usarás.
Al combinarlos, no solo reduces capas: también evitas que archivos basura queden almacenados en capas intermedias.
¿Reducir capas reemplaza a las imágenes multi-stage?
No. Son estrategias complementarias, no excluyentes. Tanto las imágenes multi-stage como la reducción de capas buscan lo mismo: que tu imagen final pese menos y sea más eficiente. Pero atacan el problema desde ángulos distintos [04:30].
¿Cuándo uso multi-stage y cuándo reduzco capas? Usa multi-stage cuando necesitas separar el entorno de compilación del de ejecución. Reduce capas cuando quieres optimizar un Dockerfile simple agrupando comandos relacionados. Puedes combinar ambas técnicas en un mismo proyecto.
La decisión depende del escenario. Si tu proyecto compila código en un lenguaje como Go o Java, multi-stage te conviene. Si tu Dockerfile solo instala dependencias y copia archivos, fusionar capas es suficiente.
Buenas prácticas para mantener imágenes ligeras
Más allá del comando RUN, hay hábitos que ayudan a que tus imágenes nazcan optimizadas:
- Elimina archivos de configuración y cachés dentro de la misma capa donde los generas.
- Copia solo los archivos que tu aplicación realmente necesita, no todo el directorio.
- Verifica el peso de tus imágenes en Docker Desktop después de cada build para comparar resultados.
- Limpia tu terminal antes de comparar tiempos de build solo si lo necesitas; mantenerlos visibles ayuda a medir mejoras.
Al aplicar estas prácticas vas a notar que tus imágenes se vuelven más rápidas de construir, más ligeras de transferir y más eficientes al desplegarse.
¿Has medido cuánto pesan tus imágenes de Docker actuales? Cuéntame en los comentarios qué técnicas usas para optimizarlas.