Free tools Windows power users keep installed
One-click scans. No signup required.
Optimizar Docker no es una sola operación: significa reducir lo que se entrega en la imagen final, acelerar las reconstrucciones aprovechando la caché y controlar CPU y memoria cuando el contenedor se ejecuta. Cada objetivo tiene técnicas y comprobaciones distintas. Esta guía explica cómo separar compilación y ejecución, elegir una base compatible, ordenar el Dockerfile, reducir el contexto, actualizar bases con criterio y fijar límites basados en mediciones.
Empieza por identificar qué necesitas optimizar
Antes de cambiar el Dockerfile, define el síntoma. Una imagen grande suele tener herramientas de compilación, dependencias de desarrollo o archivos innecesarios. Un docker build lento en cada cambio suele indicar un contexto excesivo o una caché invalidada demasiado pronto. Un servicio inestable en producción puede estar consumiendo más memoria o CPU de la disponible, o puede fallar por límites demasiado bajos.
As an Amazon Associate I earn from qualifying purchases.
| Problema observado | Qué revisar primero | Resultado que debes validar |
|---|---|---|
| Imagen final demasiado grande | Etapas de compilación, imagen base, dependencias y archivos copiados | El runtime contiene únicamente lo necesario para ejecutar |
| Reconstrucciones repetidas lentas | Contexto enviado, orden de instrucciones y reutilización de capas | Los cambios de código no rehacen la instalación de dependencias sin necesidad |
| Consumo imprevisible en producción | Mediciones de CPU y memoria, capacidad del host y límites configurados | La carga normal funciona sin dejar el host sin recursos |
Docker resume la separación entre compilación y resultado final así: “Multi-stage builds let you reduce the size of your final image, by creating a cleaner separation between the building of your image and the final output.” Puedes consultar la explicación en Building best practices.
Separa build y runtime con multi-stage builds
Una etapa de build puede incluir compiladores, gestores de paquetes, pruebas y utilidades que no son necesarias cuando el programa ya está compilado. La etapa final parte de una base adecuada para ejecutar y copia solo binarios, archivos estáticos y dependencias de runtime. El último FROM es normalmente el resultado predeterminado del build.
#1 Best Overall
Patrón general del Dockerfile
# Etapa de compilación
FROM golang:1.23 AS build
WORKDIR /src
COPY go.mod go.sum ./
RUN go mod download
COPY . .
RUN CGO_ENABLED=0 go build -o /out/app ./cmd/app
# Etapa de ejecución
FROM gcr.io/distroless/static-debian12
COPY --from=build /out/app /app
USER 65532:65532
ENTRYPOINT ["/app"]
El ejemplo ilustra la estructura, no una recomendación universal de lenguaje o versión. Adapta las rutas y las dependencias a tu aplicación. Si el programa necesita certificados, zonas horarias, librerías nativas o un shell, la imagen final debe incluirlos explícitamente; una base más pequeña no compensa una incompatibilidad en producción.
Qué copiar y qué dejar fuera
- Copia el ejecutable o los archivos generados que el proceso necesita.
- Incluye solo dependencias de ejecución, no paquetes de pruebas ni herramientas de desarrollo.
- Comprueba permisos, rutas de configuración y certificados antes de eliminar archivos.
- Ejecuta una prueba del contenedor final, no solo de la etapa de compilación.
La guía oficial de multi-stage builds muestra un caso tutorial en el que la imagen final es de 428 MB frente a 880 MB de la original. Es un ejemplo ilustrativo de esa página, consultada el 7 de octubre de 2026; no es un porcentaje de reducción aplicable a todas las aplicaciones.
Elige una imagen base pequeña, compatible y confiable
Una base mínima puede reducir descargas, dependencias y superficie potencial de vulnerabilidades, pero la elección correcta depende de la aplicación. Compara tamaño, compatibilidad binaria, soporte, frecuencia de actualizaciones y confianza en el publicador. No existe una ganadora universal entre variantes completas, slim, Alpine o imágenes distroless.
| Criterio | Pregunta práctica | Riesgo de ignorarlo |
|---|---|---|
| Tamaño | ¿Cuánto aporta la base al tamaño total de la imagen? | Descargas y almacenamiento innecesarios |
| Compatibilidad | ¿El runtime necesita glibc, musl, librerías nativas, shell o certificados? | Errores al iniciar o fallos solo bajo carga |
| Soporte | ¿Tiene ciclo de actualizaciones y documentación adecuados? | Parcheado más difícil o versiones obsoletas |
| Confianza | ¿Conoces el origen y el proceso de publicación? | Dependencias difíciles de verificar |
Prueba la aplicación en la base candidata y revisa los errores de enlace dinámico, certificados, zonas horarias y herramientas de diagnóstico que tu operación necesite. Reducir megabytes no debe convertirse en introducir una incompatibilidad que obligue a reconstruir la imagen con paquetes improvisados.
Rank #2
Ordena las instrucciones para conservar la caché
Docker trata las instrucciones del Dockerfile como capas. Cuando cambia una capa, también deben reconstruirse las capas posteriores. Coloca primero las entradas relativamente estables, como manifiestos de dependencias, y copia después el código que cambia con frecuencia. La forma exacta depende del lenguaje y del gestor de paquetes.
Ejemplo para una aplicación con dependencias
FROM node:22-slim AS build
WORKDIR /app
COPY package*.json ./
RUN npm ci --omit=dev
COPY . .
RUN npm run build
FROM node:22-slim
WORKDIR /app
COPY --from=build /app/package*.json ./
COPY --from=build /app/node_modules ./node_modules
COPY --from=build /app/dist ./dist
USER node
CMD ["node", "dist/server.js"]
Si modificas solo un archivo de la aplicación, la capa de instalación puede reutilizarse. Si cambias package-lock.json, es correcto que Docker vuelva a instalar dependencias. Mantén una instrucción por operación lógica y evita combinar archivos que cambian a ritmos muy distintos en una misma capa.
La referencia de Docker build cache explica cómo se evalúan y reutilizan estas capas. Revisa el resultado con docker build --progress=plain -t mi-app:dev .: la salida indica qué pasos provienen de la caché y cuáles se ejecutan de nuevo.
Reduce el contexto con .dockerignore
Antes de construir, Docker envía el contexto indicado por el punto final del comando. Si contiene repositorios Git, cachés locales, artefactos de compilaciones anteriores, registros o archivos de prueba, el envío puede ser innecesariamente grande, especialmente con un builder remoto.
Rank #3
Plantilla inicial que debes adaptar
.git
.gitignore
node_modules
**/node_modules
coverage
dist
build
.cache
*.log
.env
Dockerfile*
docker-compose*.yml
No copies esta lista sin revisarla: si el Dockerfile necesita un directorio generado o un archivo de configuración para compilar, excluirlo rompe el build. El patrón correcto depende del repositorio. La documentación sobre optimización en la nube, Optimize for building in the cloud, detalla por qué un contexto pequeño también reduce transferencias remotas.
Comprueba qué se envía observando la primera fase del build y elimina del contexto todo lo que no se utilice mediante COPY o ADD. Mantén secretos fuera del contexto; no los incluyas en una capa esperando borrarlos después, porque pueden permanecer en el historial de la imagen.
Actualiza la base sin confundir --pull y --no-cache
Las etiquetas de imágenes pueden apuntar a contenidos distintos con el tiempo. --pull consulta una versión más reciente de la imagen base; --no-cache obliga a ejecutar de nuevo los pasos del Dockerfile. Son opciones diferentes y pueden combinarse.
| Comando | Qué hace | Cuándo usarlo |
|---|---|---|
docker build --pull -t mi-app:latest . |
Busca una base actualizada y conserva la caché de otros pasos cuando es posible | Reconstrucciones periódicas para incorporar parches de la base |
docker build --no-cache -t mi-app:test . |
No reutiliza capas previas | Verificar que el build funciona desde cero o depurar una caché sospechosa |
docker build --pull --no-cache -t mi-app:refresh . |
Actualiza la base y rehace todos los pasos | Refresco completo planificado, no como solución habitual a cualquier lentitud |
Define una política: registra la versión o el digest de la base para reproducibilidad, reconstruye con regularidad para recibir correcciones y prueba el resultado antes de desplegar. La sección de freshness flags de Docker explica esta diferencia.
Elimina herramientas y dependencias que no sirven en runtime
Editores, compiladores, cabeceras, depuradores y paquetes usados únicamente durante pruebas no deberían llegar a la imagen final. Multi-stage builds es la separación principal, pero también revisa los gestores de paquetes: instala dependencias de producción en la etapa final y limpia listas temporales cuando la distribución lo requiera.
- Clasifica cada dependencia como compilación, prueba o ejecución.
- Revisa que los scripts de inicio no llamen a utilidades ausentes en la base final.
- Inspecciona el contenido y las capas con las herramientas de análisis de imágenes que ya use tu organización.
- Revisa vulnerabilidades después de cada cambio de base o dependencia; una imagen menor no es automáticamente segura.
Controla CPU y memoria en ejecución
Docker deja los contenedores sin límites por defecto. Eso permite que un proceso consuma recursos del host hasta provocar presión de memoria u afectar otros servicios. Los límites correctos deben salir de mediciones de tu carga, del kernel y de la capacidad del host; no hay un valor seguro universal.
Mide primero
docker stats mi-app
# Observa CPU %, memoria usada/límite, red y E/S durante carga representativa
Registra picos, no solo promedios, durante arranque, tráfico normal y escenarios de error. Confirma también cuánta memoria y CPU tiene realmente el host o el orquestador.
Windows Errors? Fix Them Before They Spread
Repair common Windows errors and clear accumulated junk for a smoother, more stable PC - no reinstall needed.Free scan · no reinstallOutdated Drivers Are Slowing You Down
One free scan finds every outdated or missing driver and matches the right update for your exact hardware.Free scan · exact hardware matchAplica límites y verifica el comportamiento
docker run -d --name mi-app
--memory=512m
--memory-swap=512m
--cpus=1.5
mi-app:stable
--memory fija el límite de memoria y --cpus establece una cuota relativa de CPU. El ejemplo es solo sintaxis: sustituye los valores por los que tus mediciones justifiquen. Un límite demasiado bajo puede provocar reinicios, errores de asignación o tiempos de respuesta inaceptables. Un límite de memoria alcanzado puede terminar procesos por OOM; Docker advierte que una presión de memoria también puede afectar a procesos del host. Consulta Resource constraints y prueba el contenedor bajo la carga prevista antes de fijar políticas.
Best Value
- Docker, Docker Swarm, Docker Compose, Programmer, Developer, Coding, Programming, Software Engineer, Code, DevOps, Deploy, Deployment, Kubernetes, Salt, Puppet, Chef, Terraform, Container, AWS, Azure, Cloud, Geek, Funny, Computer, Software, Tech, IT
- Integration, Scrum, Compile, Compilation, Science, Bug, Debug, Python, Linux, Java, Javascript, Scala, Dotnet, Kotlin
- Lightweight, Classic fit, Double-needle sleeve and bottom hem
Diagnostica un límite incorrecto
- Si aparece un OOM, revisa el límite, el pico real, fugas y el tamaño de la carga antes de aumentarlo sin más.
- Si la CPU se mantiene limitada y aumenta la latencia, comprueba si la cuota es menor que la demanda normal.
- Si el contenedor funciona sin límites pero falla con ellos, el límite no describe todavía las necesidades de la aplicación.
Reduce privilegios sin confundir seguridad con rendimiento
Ejecutar como usuario sin privilegios limita el impacto de una vulnerabilidad, pero por sí solo no acelera la aplicación. Añade USER cuando el servicio pueda funcionar así y prepara los permisos durante la construcción.
RUN addgroup --system app && adduser --system --ingroup app app
&& chown -R app:app /app
USER app
El comando exacto cambia según la distribución base. Verifica que el usuario pueda leer configuración, escribir solo en directorios necesarios y abrir el puerto elegido. Evita conceder capacidades o acceso privilegiado como solución rápida a un error de permisos. La guía de Docker Engine security cubre esta reducción de privilegios y otras consideraciones de seguridad.
Diseña los contenedores alrededor de responsabilidades claras
Separar servicios con responsabilidades distintas facilita escalar, actualizar y reutilizar cada componente. “Un proceso por contenedor” es una regla práctica, no una prohibición inflexible: un proceso principal puede necesitar un ayudante estrechamente acoplado, pero agrupar servicios independientes suele ocultar fallos y dificulta los límites de recursos.
Recommended Free Tools
- Separa, cuando tenga sentido, API, trabajador de colas y proxy.
- Define salud, registros y configuración de cada servicio por separado.
- Escala el componente que tiene demanda, en lugar de duplicar un contenedor monolítico completo.
Flujo de trabajo para aplicar cambios con seguridad
- Establece una línea base. Guarda el tamaño de la imagen, el tiempo de un build limpio y uno incremental, y el consumo observado con carga representativa.
- Reduce el contexto. Crea o ajusta
.dockerignorey confirma que el build aún encuentra todos sus insumos. - Reordena capas. Copia primero manifiestos estables, instala dependencias y copia después el código cambiante.
- Separa etapas. Deja compiladores y herramientas en la etapa de build; copia al runtime solo los artefactos necesarios.
- Valida la base. Comprueba compatibilidad, soporte, parches y procedencia, no solo megabytes.
- Prueba frescura. Ejecuta un build con
--pullsegún tu calendario y usa--no-cacheúnicamente para una reconstrucción completa o una investigación concreta. - Mide runtime. Usa
docker statsy pruebas de carga para establecer límites de CPU y memoria. - Endurece permisos. Cambia a
USER, revisa propietarios y repite las pruebas funcionales. - Documenta la decisión. Registra la etiqueta o digest de la base, los límites elegidos y las condiciones de medición para poder reproducirlos.
Qué hacer cuando una optimización falla
El contenedor no inicia tras cambiar de base
Revisa librerías nativas, certificados, zonas horarias, usuario, rutas y variables de entorno. Vuelve temporalmente a una base compatible, identifica la dependencia concreta y decide si el ahorro justifica resolverla.
El build incremental sigue siendo lento
Comprueba si el contexto incluye archivos que cambian constantemente y si una instrucción temprana copia todo el repositorio. Revisa la salida con --progress=plain para localizar la primera capa que pierde la caché.
La imagen final creció después de añadir una función
Compara las dependencias nuevas y verifica que no se hayan copiado artefactos de pruebas o la etapa completa de compilación. El tamaño depende de la aplicación; elimina solo lo que no sea necesario para ejecutar.
El servicio recibe OOM después de fijar memoria
Correlaciona el evento con la métrica de memoria y la carga que lo provocó. Ajusta la aplicación o el límite con evidencia y confirma que el host conserva margen para el sistema y otros contenedores.
Quick wins for a faster PC:
Repair Windows errors before they cause bigger problemsFix Now →Fix the driver behind crashes, sound loss and screen glitchesFind Drivers →Clear out junk files and repair common Windows errorsFree Scan →Quick Recap
Lista de comprobación antes de desplegar
- ¿El Dockerfile tiene una etapa final de runtime sin herramientas de compilación innecesarias?
- ¿La base cumple requisitos de librerías, soporte y confianza?
- ¿Las dependencias estables se instalan antes de copiar el código cambiante?
- ¿
.dockerignoreexcluye cachés, repositorios, secretos y artefactos sin excluir entradas necesarias? - ¿La política distingue
--pullde--no-cachey contempla reconstrucciones periódicas? - ¿La aplicación funciona como usuario sin privilegios con permisos verificados?
- ¿Los límites de CPU y memoria provienen de mediciones y han sido probados bajo carga?
- ¿Cada contenedor tiene una responsabilidad que pueda mantenerse y escalarse con claridad?
Product prices and availability are accurate as of the date/time indicated and are subject to change. Any price and availability information displayed on Amazon at the time of purchase will apply.

