Halloween DealsAmazon USHalloween week deals: useful picks before month-endAmazon US: current deals, useful picks and tech finds.Check DealsSlow PC?RecommendedPC slow today? Run a repair scan before it gets worseResolve common Windows issues and optimize system performance.Scan NowHalloween DealsAmazon USOctober picks are moving - compare before checkoutAmazon US: current deals, useful picks and tech finds.See Picks×
FREEDOM251

Freedom251 › Blog › contenedores

¿Cómo conseguir contenedores Docker ligeros y builds rápidos?

By Freedom251 Team · · 10 min read

Free tools Windows power users keep installed

One-click scans. No signup required.

Special offer. See more information about Outbyte and uninstall instructions. Please review EULA and Privacy policy.

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.

Special offer. See more information about Outbyte and uninstall instructions. Please review EULA and Privacy policy.

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.

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.

Special offer. See more information about Outbyte and uninstall instructions. Please review EULA and Privacy policy.
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.

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.

Special offer. See more information about Outbyte and uninstall instructions. Please review EULA and Privacy policy.

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.

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.

Special offer. See more information about Outbyte and uninstall instructions. Please review EULA and Privacy policy.
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.

Special offer. See more information about Outbyte and uninstall instructions. Please review EULA and Privacy policy.

Aplica 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 Container Linux Devops Programming Coding T-Shirt
  • 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.
Independent reader supportYour contribution helps us test, update, and keep practical guides available for everyone.Support on Ko-Fi

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.

Special offer. See more information about Outbyte and uninstall instructions. Please review EULA and Privacy policy.
  • 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

  1. 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.
  2. Reduce el contexto. Crea o ajusta .dockerignore y confirma que el build aún encuentra todos sus insumos.
  3. Reordena capas. Copia primero manifiestos estables, instala dependencias y copia después el código cambiante.
  4. Separa etapas. Deja compiladores y herramientas en la etapa de build; copia al runtime solo los artefactos necesarios.
  5. Valida la base. Comprueba compatibilidad, soporte, parches y procedencia, no solo megabytes.
  6. Prueba frescura. Ejecuta un build con --pull según tu calendario y usa --no-cache únicamente para una reconstrucción completa o una investigación concreta.
  7. Mide runtime. Usa docker stats y pruebas de carga para establecer límites de CPU y memoria.
  8. Endurece permisos. Cambia a USER, revisa propietarios y repite las pruebas funcionales.
  9. 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.

Special offer. See more information about Outbyte and uninstall instructions. Please review EULA and Privacy policy.

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?
  • ¿.dockerignore excluye cachés, repositorios, secretos y artefactos sin excluir entradas necesarias?
  • ¿La política distingue --pull de --no-cache y 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.

contenedoresDevOpsDockerDockerfileOptimización

Leave a Reply

Your email address will not be published. Required fields are marked *

Special offer. See more information about Outbyte and uninstall instructions. Please review EULA and Privacy policy.

Recommended PC Tool
Recommended PC Tool
Windows Errors? Fix Them Before They SpreadFree repair scan
Crashes, No Sound, or Screen Glitches?Free driver scan

Two free Windows tools

One Free Minute Could Fix That PC

Before you go - each of these free tools takes about a minute and tackles what quietly slows a Windows PC down.

Special offer. View Outbyte info, uninstall instructions, EULA, and Privacy Policy.